2010-03-04 59 views
3

我對使用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中有沒有什麼幫助。

回答

2

嗯,我知道了:

調試休眠代碼後,我發現你需要建立在實體類的例子。所以,我創建的實體中的一個實例,將內含價值和被排斥的例子標準的未使用的屬性:

Criteria query = getSession().createCriteria(EntityClass.class); 
EntityClass example = new EntityClass(); 
example.setEmbedded(embedded); 
query.add(Example.create(example).excludeNone() 
    .excludeProperty("id").excludeProperty("other")); 
return (EntityClass) query.uniqueResult(); 
0

查看針對您的標準的isNull限制。我認爲它適用於每個會話的基礎:

Criteria entityCriteria = getSession().createCriteria(EntityClass.class); 
entityCriteria.add(Restrictions.isNull("optional")); // isNull restriction on the optional attribute of your EntityClass 
List results = entityCriteria.list(); 
+0

你是對的,但這不是問題。示例創建isNull和eq限制。 – 2010-03-05 07:28:58

相關問題