質問

私は非常に簡単なクエリを書いていますが、何らかの理由で重複した値を取得しています。

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

重複した値を返しません。

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

役に立ちましたか?

解決

速い回避策は、異なるルートエンティティ結果トランスを使用することです。

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

しかし、これは回避的です。

問題はあなたのマッピングに属します。プロセスインスタンスから何か他のもの(xと呼ばれる)までの熱心なロードが1:n関係があり、1つのProcessInstanceにいくつかの(n)xがあります。プロセスインスタンス。 - これが本当に原因である場合、ワークアラウンドが単なる回答ではない場合、それは解決策になります。

他のヒント

私はあなたと同じ問題を取り入れます。

これが私がそれを解決する方法です。

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

これにより、すべての基準を満たすすべてのIDが返されます。

あなたが使用した後にそこに In 制限と実行 CriteriaSpecification.DISTINCT_ROOT_ENTITY.

結果を2番目の基準でスクロールできるようになります。これを願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top