2012-09-05 81 views
6

我試圖通過另一個查詢的結果來縮小Hibernate Criteria查詢的結果集。我知道如何解決這個問題與JPQL:通過子查詢縮小查詢結果

FROM DocPackage p WHERE 
    EXISTS (SELECT g 
    FROM ObjectGroup g JOIN g.items i, Person per 
    WHERE g=p.applicantGroup 
     AND i.objectClass = 'org.cp.model.common.Person' 
     AND i.objectId=per.id 
     AND lower(concat(per.firstName,' ',per.lastName)) like :applicant 
) 

但我無法想象如何使用標準進行此類查詢。任何想法如何使用Criteria實現這個選擇?使用Hibernate 3.3。

UPD:試圖解決這個問題,我已經做了如下條件查詢:

Criteria resultCriteriaQuery = this.hibernateSession.createCriteria(DocPackage.class, "pack"); 
     DetachedCriteria personSubquery = DetachedCriteria.forClass(Person.class, "pers"). 
      add(Restrictions.like("pers.loFstLstName", "%" + searchObject.getApplicant().toLowerCase() + "%")). 
      add(Restrictions.eqProperty("itm.objectId", "pers.id")); 
     DetachedCriteria applicantsSubquery = DetachedCriteria.forClass(ObjectGroup.class, "objGrp"). 
      add(Restrictions.eqProperty("pack.applcantGroup", "objGrp")). 
      createAlias("objGrp.items", "itm"). 
      add(Restrictions.eq("itm.objectClass", "org.cp.model.common.Person")). 
      add(Subqueries.exists(personSubquery)); 
     resultCriteriaQuery.add(Subqueries.exists(applicantsSubquery)); 

但它不工作。我在resultCriteriaQuery.list()上有NullPointerException。這個查詢有什麼問題?有任何想法嗎?

回答

0

更好一點來分析的情況下,從打印的標準自動生成的HQL語句,你必須把在連接屬性休眠:

<property name="hibernate.show_sql" value="true" /> 
<property name="hibernate.format_sql" value="true" /> 

和日誌調試。

一旦你有了它,你可以比較你想要產生和查看差異。

問候,

0

您可以創建子標準與Criteria.createCriteria(String)方法。

假設以下場景:

B類的名稱爲String。

A類有一個元素:Set。

你現在想要的(除了其他限制)只有A-對象,其中有一架B與NAME = 「X」:

Criteria crit = session.createCriteria(A.class); 
<add your restrictions for A> 

Criteria narrow = crit.createCriteria("elements"); 
narrow.add(Restrictions.eq("name", "X"); 

// This will respect the constraints applied to narrow 
crit.list(); 
0

非相關的連接並不由Hibernate API的標準支持。該行是一個問題:

FROM ObjectGroup g JOIN g.items i, Person per 

從我所看到的,你需要創建ObjectGroupItem人之間明確的對應關係。這可以通過Hibernate @Any註解來完成。看看Hibernate Annotations,第2.4.5.2段。當關聯被映射時,使用Criteria#createCriteria()或Criteria#createAlias()向子查詢添加必要的連接。您已經在使用正確的API將子查詢添加到主查詢中。