簡體   English   中英

Hibernate 標准對兒童有限制

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM