2011-01-10 168 views
6

我正在寫一個非常簡單的查詢,但出於某種原因我得到重複值。休眠,獲取重複值

Criteria cr = session.createCriteria(ProcessInstance.class, "p") 
     .add(Restrictions.isNull("end")); 
@Cleanup ScrollableResults sr = cr.scroll(ScrollMode.FORWARD_ONLY); 

while (sr.next()) { 
    pi = (ProcessInstance) sr.get(0); 
    String id = pi.getId(); //Getting duplicate values 
} 

pi.getId()返回重複值。即:*9,9,10,10,11,11 etc*

然而,直接在mysql中

SELECT * FROM JBPM_PROCESSINSTANCE J where J.END_ IS NULL 

運行此查詢不返回重複值。

任何人都可以發現什麼是錯的?

+0

沒有你的映射很難說。 – Matt 2012-08-03 16:02:09

回答

17

快速工作週期將使用不同的根實體結果轉換器。

... 
crit.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); 
List unique = crit.List(); 
... 

但這只是一個工作周。

我問問題屬於你的映射。如果從ProcessInstance到另一個(稱爲X)存在任何預先加載的1:n關係,並且對於一個ProcessInstance有幾個(n)X,則您將在結果列表中獲得多個ProcessInstance項目(n) processInstance的。 - 如果這是真正的原因,那麼工作週期不僅僅是一個工作週期,那麼它就是解決方案。

+0

是的,這是正確的。我們改變了映射以獲取渴望。謝謝 – 2011-01-10 10:29:11

2

我爲你解決了同樣的問題。

這就是我解決問題的方法。

Criteria cr = session.createCriteria(ProcessInstance.class, "p") 
     .add(Restrictions.isNull("end")).setProjection("id") 

這將返回滿足所有條件的所有ID。

那裏您使用In限制並執行CriteriaSpecification.DISTINCT_ROOT_ENTITY

您將能夠在第二條標準中滾動您的結果。我希望這可以幫到您。