2011-01-10 111 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

您将能够在第二条标准中滚动您的结果。我希望这可以帮到您。