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.

Schreibe einen Kommentar