使用IN语句的Eclipselink JPA类型安全查询

时间:2012-05-10 01:23:02

标签: mysql jpa-2.0 eclipselink

我设置了使用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();

结果实际上是相反的 - 我得到STATUS不是C,U,D。 如果我更改谓词条件2行 - 我得到了我期望的结果?

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

MySQL驱动程序或Eclipselink是否存在错误?还是我思考的一个缺陷?

  

我希望从ActiivtyLog中检索divsion = div和status   IN(C,U,D)

1 个答案:

答案 0 :(得分:1)

为什么使用qb.equal(p.get(ActivityLog_.status),yourInCondition)?处于状态应该返回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) );