Herr_M
Erfahrenes Mitglied
Hallo Zusammen,
Ich habe ein Problem bei der Verwendung eines Native Querys mit Hibernate.
Ich habe ein Native Query, dessen Resultset über ein SqlResultSetMapping auf 3 verschiedene Beans gemapt ist. Eines der Beans eine IdClass (FormKriterienBean.java), da sich dessen Primary Key aus 2 Attributen zusammensetzt.
Führe ich nun das Query aus, erhalte ich für die beiden Beans ohne den zusammengesetzten Primary Key meine Werte (KriterienBean, KritGruppenBean), und für die Klasse mit IdClass (FormKriterienBean.java) nur "null".
Deaktiviere ich den zusammengesetzten Key, dadurch dass ich die @IdClass Annotation einfach auskommentiere, so erhalte ich beim ausführen für alle 3 Beans die Werte.
Hat jemand ne Idee was hier nicht stimmt?
Und vor allem was kann ich dagegen tun?
Hier noch ein paar Codeschnipsel und Klassen:
Erstmal der Codeschnipsel der das NativeQuery erzeugt und ausführt:
Hier die Klasse FormKriterienBean:
Hier die IdClass dazu FormKriterienBeanPK
Hier die Klasse KritGruppenBean:
Und hier die Klasse KriterienBean:
Ich habe ein Problem bei der Verwendung eines Native Querys mit Hibernate.
Ich habe ein Native Query, dessen Resultset über ein SqlResultSetMapping auf 3 verschiedene Beans gemapt ist. Eines der Beans eine IdClass (FormKriterienBean.java), da sich dessen Primary Key aus 2 Attributen zusammensetzt.
Führe ich nun das Query aus, erhalte ich für die beiden Beans ohne den zusammengesetzten Primary Key meine Werte (KriterienBean, KritGruppenBean), und für die Klasse mit IdClass (FormKriterienBean.java) nur "null".
Deaktiviere ich den zusammengesetzten Key, dadurch dass ich die @IdClass Annotation einfach auskommentiere, so erhalte ich beim ausführen für alle 3 Beans die Werte.
Hat jemand ne Idee was hier nicht stimmt?
Und vor allem was kann ich dagegen tun?
Hier noch ein paar Codeschnipsel und Klassen:
Erstmal der Codeschnipsel der das NativeQuery erzeugt und ausführt:
Code:
public List<KriterienCombinationValueObject> selectFormkriterien(int foidx)
throws Exception {
try {
System.out.println("AccessSessionBean - selectFormkriterien(int foidx)");
String sqlStmt =
" SELECT " +
" k.kritgruppennr AS kritgruppennr, " +
" kg.kritgruppenbez AS kritgruppenbez, " +
" k.krname AS krname, " +
" fk.text AS text, " +
" fk.foidx AS foidx, " +
" fk.krnr AS krnr, " +
" fk.fknr AS fknr, " +
" k.krnr AS kkrnr, k.krtyp AS kkrtyp, " +
" kg.kritgruppennr AS kgkritgruppennr" +
" FROM " +
" formkriterien fk, " +
" kriterien k, " +
" kritgruppen kg " +
" WHERE fk.foidx = " + foidx +
" AND k.krnr = fk.krnr " +
" AND k.kritgruppennr = kg.kritgruppennr ";
List<KriterienCombinationValueObject> listeFormKriterien =
new ArrayList<KriterienCombinationValueObject>();
Query query = manager.createNativeQuery(sqlStmt, "formkriterienUndKriterienUndKriterienGruppen");
@SuppressWarnings("unchecked")
List resultList = query.getResultList();
for (int i = 0; i < resultList.size(); i++) {
KriterienCombinationValueObject formKriterium = new KriterienCombinationValueObject();
Object obj = resultList.get(i);
Object[] objArray = (Object[]) obj;
KriterienBean kb = (KriterienBean) objArray[1];
KritGruppenBean kgb = (KritGruppenBean) objArray[2];
FormKriterienBean fkb = (FormKriterienBean) objArray[0];//TODO Ist im Moment null
formKriterium.setKritgruppennr(kgb.getKritGruppenNr());
formKriterium.setKritgruppenbez(kgb.getKritGruppenBez() == null? "":kgb.getKritGruppenBez());
formKriterium.setKrname(kb.getKrName() == null? "":kb.getKrName());
formKriterium.setFormkriterientext(fkb.getText() == null? "":fkb.getText());
listeFormKriterien.add(formKriterium);
}
return listeFormKriterien;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
Hier die Klasse FormKriterienBean:
Code:
package com.de.irgendeinefirma.fmdb.ejb;
import javax.persistence.*;
@Entity
@IdClass(FormKriterienPK.class)
@Table(name="FORMKRITERIEN")
@SqlResultSetMapping(name="formkriterienUndKriterienUndKriterienGruppen",
entities={@EntityResult(entityClass=FormKriterienBean.class),
@EntityResult(entityClass=KriterienBean.class,
fields={@FieldResult(name="krNr", column="kkrnr"),
@FieldResult(name="kritGruppenNr", column="kritgruppennr"),
@FieldResult(name="krName", column="krname"),
@FieldResult(name="krTyp", column="kkrtyp")}),
@EntityResult(entityClass=KritGruppenBean.class,
fields={@FieldResult(name="kritGruppenBez", column="kritgruppenbez"),
@FieldResult(name="kritGruppenNr", column="kgkritgruppennr")})
})
@SequenceGenerator(name="KRITGRUPPENNR_SEQUENCE", sequenceName="SEQ_FORMKRITERIEN_FOIDX")
public class FormKriterienBean implements java.io.Serializable {
private int foIdx;
private int fkNr;
private String text = "";
private Integer krNr = Integer.valueOf(0);
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="KRITGRUPPENNR_SEQUENCE")
public int getFkNr() {
return fkNr;
}
public void setFkNr(int fkNr) {
this.fkNr = fkNr;
}
@Id
public int getFoIdx() {
return foIdx;
}
public void setFoIdx(int foIdx) {
this.foIdx = foIdx;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public Integer getKrNr() {
return krNr;
}
public void setKrNr(Integer krNr) {
this.krNr = krNr;
}
}
Hier die IdClass dazu FormKriterienBeanPK
Code:
package com.de.irgendeinefirma.fmdb.ejb;
public class FormKriterienPK implements java.io.Serializable {
private Integer foIdx = 0;
private Integer fkNr = 1;
public FormKriterienPK() {}
public FormKriterienPK(int foIdx, int fkNr) {
this.foIdx = foIdx;
this.fkNr = fkNr;
}
public int getFkNr() {
return fkNr;
}
public void setFkNr(int fkNr) {
this.fkNr = fkNr;
}
public int getFoIdx() {
return foIdx;
}
public void setFoIdx(int foIdx) {
this.foIdx = foIdx;
}
public boolean equals(Object obj){
if( obj == this){
return true;
}
if(!(obj instanceof FormKriterienPK)) {
return false;
}
FormKriterienPK pk = (FormKriterienPK)obj;
if(fkNr != pk.fkNr){
return false;
}
if( foIdx != pk.foIdx){
return false;
}
return true;
}
public int hashCode(){
return (int)fkNr + (int)foIdx;
}
}
Hier die Klasse KritGruppenBean:
Code:
package com.de.irgendeinefirma.fmdb.ejb;
import javax.persistence.*;
@Entity
@Table(name = "KRITGRUPPEN")
@SequenceGenerator(name="KRITGRUPPENNR_SEQUENCE", sequenceName="SEQ_KRITGRUPPEN_NR")//TODO Sequenz in DB erstellen und Name vergeben
public class KritGruppenBean implements java.io.Serializable {
private int kritGruppenNr = 0;
private String kritGruppenBez = "";
public String getKritGruppenBez() {
return kritGruppenBez;
}
public void setKritGruppenBez(String kritGruppenBez) {
this.kritGruppenBez = kritGruppenBez;
}
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="KRITGRUPPENNR_SEQUENCE")
public int getKritGruppenNr() {
return kritGruppenNr;
}
public void setKritGruppenNr(int kritGruppenNr) {
this.kritGruppenNr = kritGruppenNr;
}
}
Und hier die Klasse KriterienBean:
Code:
package com.de.irgendeinefirma.fmdb.ejb;
import javax.persistence.*;
@Entity
@Table(name = "KRITERIEN")
@SqlResultSetMapping(name="formkriterienUndkriterien",
entities={@EntityResult(entityClass=KriterienBean.class,
fields={@FieldResult(name="krName", column="kriterien.krname"),
@FieldResult(name="krTyp", column="kriterien.krtyp")}),
@EntityResult(entityClass=FormKriterienBean.class,
fields={@FieldResult(name="foidx", column="formkriterien.foidx"),
@FieldResult(name="krNr", column="formkriterien.krnr"),
@FieldResult(name="text", column="formkriterien.text")})
})
@SequenceGenerator(name="KRNR_SEQUENCE", sequenceName="SEQ_KRITERIEN_KRNR")
public class KriterienBean implements java.io.Serializable {
private int krNr;
private int kritGruppenNr;
private String krName;
private Integer krTyp;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="KRNR_SEQUENCE")
public int getKrNr() {
return krNr;
}
public void setKrNr(int krNr) {
this.krNr = krNr;
}
public int getKritGruppenNr() {
return kritGruppenNr;
}
public void setKritGruppenNr(int kritGruppenNr) {
this.kritGruppenNr = kritGruppenNr;
}
public String getKrName() {
return krName;
}
public void setKrName(String krName) {
this.krName = krName;
}
public Integer getKrTyp() {
return krTyp;
}
public void setKrTyp(Integer krTyp) {
this.krTyp = krTyp;
}
}