[英]Hibernate criteria with restrictions on children
我有一個 Hibernate 標准調用,我想在一個 SQL 語句中執行。 我正在嘗試做的是 select 的 Parent 實例,這些實例的 Child 具有一系列值(SQL IN 子句)的屬性,同時使用外連接加載孩子。 這是我到目前為止所擁有的:
Criteria c = session.createCriteria(Parent.class);
c.createAlias("children", "c", CriteriaSpecification.LEFT_JOIN)
.setFetchMode("c", FetchMode.JOIN)
.add(Restrictions.in("c.property", properties));
c.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
return c.list();
以下是一些示例數據:
Parent
Parent ID
A
B
C
Children
Child ID Parent ID property
... A 0
... A 2
... A 7
... B 1
... C 1
... C 2
... C 3
如果其中一個孩子的屬性等於我的綁定參數,我想要做的是返回父母和他們的所有孩子。 假設 properties 是一個包含 {2} 的數組。 在這種情況下,調用將返回父母 A 和 C 但他們的孩子 collections 將只包含元素 2。即 Parent[Children]:
A[2] 和 C[2]
我想要的是:
A[0, 2, 7] & C[1, 2 3]
如果這不是一個錯誤,它似乎是一個損壞的語義。 我看不出調用 A.getChildren() 或 C.getChildren() 並返回 1 條記錄會被認為是正確的——這不是預測。 即,如果我增加查詢以使用默認的 select 提取,它會返回正確的子 collections,盡管有大量查詢:
c.createAlias("children", "c").add(
Restrictions.in("c.property", properties));
這是一個錯誤嗎? 如果沒有,我怎樣才能達到我想要的結果?
Criteria c = session.createCriteria(Parent.class);
c.createAlias("children", "children");
c.add(Restrictions.in("children.property", properties));
c.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
return c.list();
我將從子 class 開始標准。 你會得到一個包含所有孩子的列表,然后你可以迭代並為每個孩子獲取父母。
這可以通過解決方法來完成。
Criteria c1 = session.createCriteria(Child.class);
c1.add(Restrictions.in("property", properties));
c1.setProjection( Projections.distinct( Projections.property( "parentId" ) ) );
List<Integer> parentIds = c1.list();
Criteria c2 = session.createCriteria(Parent.class);
c2.createAlias("children", "children");
c2.add(Restrictions.in("id", parentIds));
return c2.list();
getChildren() 只是 getter/setter 的名稱,您的查詢將確定對象的填充方式。
我猜這里第一部分吐出來了
SELECT * FROM Parent
INNER JOIN Child c ON ...
WHERE c.property in (x,y,z)
這不會讓你得到你想要的。 如果您在原始 SQL 中編寫此內容,您會想要做什么:
SELECT * FROM Parent
WHERE ParentID IN (SELECT DISTINCT parentID FROM Child WHERE c.property in (x,y,z))
如果最后一個沒有產生此查詢,則適當地重新排列您的標准可能會起到作用。 (您還可以發布 hibernate 為每個生成的內容嗎?)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.