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()返回重复值。IE:*9,9,10,10,11,11 etc*

但是,直接在 mysql 中运行此查询

SELECT * FROM JBPM_PROCESSINSTANCE J where J.END_ IS NULL

不返回重复值。

谁能发现哪里出了问题?

4

2 回答 2

18

快速的解决方法是使用 Distinct Root Entity Result Transformer。

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

但这只是一种解决方法。

我怀疑问题属于您的映射。如果从 ProcessInstance 到其他东西(称为 X)存在任何急切加载的 1:n 关系,并且一个 ProcessInstance 有多个 (n) X,那么您将在结果列表中获得多个 ProcessInstance 项 (n)进程实例。- 如果这真的是原因,那么工作区不仅仅是一个工作区,那么它就是解决方案。

于 2011-01-10T10:02:21.817 回答
2

我遇到了和你一样的问题。。

这就是我解决它的方法。

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

这将返回满足所有条件的所有 ID。

在你使用In限制和执行之后CriteriaSpecification.DISTINCT_ROOT_ENTITY

您将能够在第二个标准中滚动您的结果。我希望这会有所帮助。

于 2012-08-03T14:08:23.923 回答