1

WHERE IN を使用してデータベースにクエリを実行する方法を設定しましたが、クエリが予想とは逆に実行されます。

CriteriaBuilder qb = getEntityManager().getCriteriaBuilder();
CriteriaQuery<ActivityLog> c = qb.createQuery(ActivityLog.class);
Root<ActivityLog> p = c.from( ActivityLog.class );
Predicate condition1 = qb.equal( p.get(ActivityLog_.div), div);

Collection<String> viewStatus = new ArrayList<String>();
viewStatus.add("C");
viewStatus.add("U");
viewStatus.add("D");
Predicate condition2 = qb.equal(p.get(ActivityLog_.status), p.get(ActivityLog_.status).in(viewStatus));

c.where( qb.and(condition1, condition2) );
c.orderBy( qb.desc( p.get( ActivityLog_.update_time.getName() ) ) );

TypedQuery<ActivityLog> q = getEntityManager().createQuery(c); 
q.setMaxResults(15);

return q.getResultList();

結果は実際には反対です - C、U、D ではない STATUS を取得します。Predicate condition2 行を変更すると、期待どおりの結果が得られますか??

Predicate condition2 = qb.notEqual(p.get(ActivityLog_.status), p.get(ActivityLog_.status).in(viewStatus));

MySQL ドライバーまたは Eclipselink にバグはありますか? または私の考えの欠陥?

私の希望は、ActivityLog から取得することです。ここで、divsion = div およびステータス IN (C、U、D) です。

4

1 に答える 1

1

なぜ qb.equal(p.get(ActivityLog_.status), yourInCondition) を使用しているのですか? in 条件は true または false を返す必要があるため、ステータスが等しいことを確認する必要がある理由がわかりません。
EclipseLink では、Logging を Fine または Finest に切り替えて、生成された SQL を確認できます。これにより、クエリがどのように間違っているかを簡単に知ることができます。

代わりにあなたが望むかもしれないと思うのは

Predicate condition2 = p.get(ActivityLog_.status).in(viewStatus)) 

これは次のようにもできます:

In<String> in = qb.in( p.get(ActivityLog_.status) );
in.value("C").value("U").value("D");
c.where( qb.and(condition1, in) );
于 2012-05-10T13:37:50.200 に答える