2009-10-13 23 views
24

有沒有人知道Hibernate的Criteria.list()Query.list()方法返回多次出現的同一個實體的有效性?它是否有效的休眠列表()返回重複?

偶爾我發現在使用Criteria API時,在我的類映射定義中(從「select」到「join」)更改默認獲取策略有時會影響到同一實體的多少引用可能出現在結果輸出中的list(),我不確定是否將此視爲錯誤。 javadoc沒有定義它,它只是說「匹配的查詢結果列表」。 (多謝你們)。

如果這是預期的和正常的行爲,那麼我可以自己去重複列表,但這不是問題,但如果它是一個錯誤,那麼我寧願避免它,而不是去重複結果並嘗試忽略它。

任何人都有這方面的經驗?

回答

20

是的,如果您構建查詢以便發生這種情況,那麼獲取重複是完全可能的。例如參見Hibernate CollectionOfElements EAGER fetch duplicates elements

+6

+1。我怎麼能不能upvote鏈接到我的答案? :-)然而,嚴重的是,當有多個「一對多」關聯或者在同一個查詢中使用聯接獲取進行提前獲取或者檢索時,Hibernate可能會返回重複數據。查看14.3底部的註釋:http://docs.jboss.org/hibernate/stable/core/reference/en/html/queryhql.html#queryhql-joins – ChssPly76 2009-10-13 15:53:29

+0

感謝文檔鏈接,我知道它有要在那裏 – skaffman 2009-10-13 16:02:31

+0

@ ChssPly76鏈接已損壞! – Champ 2013-07-08 12:14:08

4

如果您有一個包含子對象列表的對象,並且您的條件將這兩個表連接在一起,那麼您可能會獲得主對象的重複項。

確保不重複的一種方法是使用DistinctRootEntityResultTransformer。如果您使用結果集緩衝/行計數,則主要缺點是這種情況。兩者不能一起工作。

4

我開始注意到這種行爲在我的Java API中開始增長。很高興有一個簡單的方法來防止它。在練習中,我已經開始追加:

.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 

返回列表的所有條件。例如:

List<PaymentTypeAccountEntity> paymentTypeAccounts = criteria() 
    .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 
    .list();