2012-04-16 73 views
0

我想用Hibernate Criteria Query的子對象列表查詢Parent對象。我知道如何用孩子的ID做,但不直接使用實體。Hibernate:Criteria按實體查詢子對象(關聯)(不是Id)

這工作:

List<Long> listOfChildLongChildIds = new ArrayList<Long>(); 
listOfChildLongChildIds.add(new Long(1)); 
listOfChildLongChildIds.add(new Long(2)); 

Criteria criteria = getSession().createCriteria(Parent.class); 
Criteria criteriaChilds = criteria.createCriteria("childs"); 
criteriaChilds.add(Restrictions.in("id", listOfChildLongChildIds)); 

但如何做到這一點,當列表中包含的子對象/實體是這樣的:

List<Child> listOfChildEntities = new ArrayList<Child>(); 
listOfChildEntities.add(QueryChildFromDatabse); 
listOfChildEntities.add(QueryChildFromDatabse); 

(這意味着我不使用兒童的ID但只有Entitiy本身。原因是否則我將不得不迭代通過我的孩子列表,並提取所有ID並將它們放入列表中,我認爲這很可能是不必要的。但是我無法找到任何信息如何查詢由實體列表本身):

然後使用以上

criteriaChilds.add(Restrictions.in("id",listOfChildEntities)); 

會拋出異常的代碼:

兒童不能轉換爲java.lang.Long中

回答

0

你應該能夠對象傳遞給限制.in方法。

Restrictions.in("childs", <childObjectslist>) 
+0

非常感謝您的回答!但問題是(至少在我的測試中,你的建議失敗了!),你命名爲「childs」的參數必須是(根據文檔)Child對象的屬性/成員。當我通過ID查詢時,它肯定是一個ID。我需要的是一個像這樣的語句:Restrictions.idIn();你有什麼特殊的文件,你的答案是基於?不過謝謝你的回答。 – Markus 2012-04-16 06:39:57

5

我想你應該能夠做這樣的事情:

Criteria criteria = getSession().createCriteria(Parent.class); 
criteria.createCriteria("childs","childs"); 
criteria.add(Restrictions.in("childs.id", listOfChildLongChildIds)); 
相關問題