Wie die Abfrage von embedded Beispiel die null-Werte enthalten mit hibernate?
Ich habe ein problem mit einer Abfrage, die mit hibernate. Die entity-Klasse EntityClass
hat eine eingebettete Eigenschaft embedded
Typ EmbeddedClass
und diese Eigenschaft hat eine nullable-Eigenschaft optional
. Wenn alle Eigenschaften eingestellt sind, kann ich eine sehr simpel HQL-Abfrage als:
Query query = getSession().createQuery(
"FROM EntityClass t WHERE t.embedded = :embedded");
query.setParameter("embedded", embedded);
return (EntityClass) query.uniqueResult();
Aber, wenn die Eigenschaft optional
null ist, funktioniert dies nicht, da hibernate erzeugt eine SQL-Abfrage wie t.optional=?
aber =NULL
sollte IS NULL
in SQL. Die WHERE-Klausel nie matches, die Abfrage gibt keine Zeilen zurück.
Einige weitere Lesen zeigte zum Beispiel die Handhabung von null-richtig. Nun mein code sieht wie folgt aus:
Criteria query = getSession().createCriteria(EntityClass.class);
query.createCriteria("embedded").add(Example.create(embedded));
return (EntityClass) query.uniqueResult();
Beim ausführen des code bekomme ich eine ClassCastException
:
java.lang.ClassCastException: EmbeddedClass
at org.hibernate.criterion.Example.getEntityMode(Example.java:279)
at org.hibernate.criterion.Example.toSqlString(Example.java:209)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:357)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:113)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:82)
at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:91)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1577)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:306)
at org.hibernate.impl.CriteriaImpl.uniqueResult(CriteriaImpl.java:328)
Es hat etwas zu tun mit EntityPersister.guessEntityMode()
null zurückgeben, weil hibernate sieht für das mapping der entity-Klasse, nicht das eingebettete.
Es scheint, dass die org.hibernate.Kriterium.Beispielsweise kann nicht verwendet werden, die für eine eingebettete Klasse. Eine Idee, wie man das an? Gibt es eine andere Vorgehensweise?
Den Klassen Aussehen:
@Entity
public class EntityClass {
...
@Embedded
private EmbeddedClass embedded;
...
}
@Embeddable
public class EmbeddedClass {
private String name;
private String optional;
...
}
Verwende ich hibernate 3.3.1 und einer oracle 10g, ob das hilft.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Äh, ich habe es:
Nach dem Debuggen der hibernate-code, ich entdeckte Sie brauchen, um zu bauen zum Beispiel die entity-Klasse. Also habe ich ein Beispiel erstellt Instanz der Entität, setzen Sie den embedded value und ausgeschlossen die nicht verwendeten Eigenschaften der Beispiel-Kriterium:
Blick in die
isNull
Einschränkung für Ihre Kriterien. Ich denke, es funktioniert auf einer basis pro Sitzung: