我對使用hibernate的查詢有問題。實體類EntityClass
擁有EmbeddedClass
類型的嵌入式屬性embedded
,此屬性具有可爲空的屬性optional
。當所有的屬性設置,我可以做一個非常simpel HQL查詢爲:如何通過使用hibernate包含空值的嵌入式示例進行查詢?
Query query = getSession().createQuery(
"FROM EntityClass t WHERE t.embedded = :embedded");
query.setParameter("embedded", embedded);
return (EntityClass) query.uniqueResult();
但當財產optional
爲null,這是不行的,因爲Hibernate會建立像t.optional=?
但=NULL
一個SQL查詢應該是IS NULL
在SQL。 WHERE子句永不匹配,查詢不返回任何行。
一些進一步的閱讀指向正確處理null的示例。現在我的代碼如下所示:
Criteria query = getSession().createCriteria(EntityClass.class);
query.createCriteria("embedded").add(Example.create(embedded));
return (EntityClass) query.uniqueResult();
運行代碼時,我收到了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)
它是與EntityPersister.guessEntityMode()
返回null,因爲Hibernate會尋找實體類的映射,不是嵌入式的。
看來,org.hibernate.criterion.Example不能用於嵌入類。任何想法如何對此?有沒有更好的方法?
的類看起來像:
@Entity
public class EntityClass {
...
@Embedded
private EmbeddedClass embedded;
...
}
@Embeddable
public class EmbeddedClass {
private String name;
private String optional;
...
}
我使用Hibernate 3.3.1和Oracle 10g中有沒有什麼幫助。
你是對的,但這不是問題。示例創建isNull和eq限制。 – 2010-03-05 07:28:58