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

重複する値を返しません。

誰かが何が悪いのかを見つけることができますか?

4

2 に答える 2

18

迅速な回避策は、Distinct Root EntityResultTransformerを使用することです。

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

ただし、これは回避策にすぎません。

問題はあなたのマッピングにあると思います。ProcessInstanceから他の何か(Xと呼びます)への熱心にロードされた1:n関係があり、1つのProcessInstanceに複数の(n)Xがある場合、単一の結果リストに複数のProcessInstanceアイテム(n)が含まれます。 ProcessInstance。-これが本当に原因である場合、回避策は単なる回避策ではなく、解決策になります。

于 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

あなたは2番目の基準であなたの結果をスクロールすることができるでしょう..私はこの助けを願っています。

于 2012-08-03T14:08:23.923 に答える