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

标签 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();

结果实际上是相反的——我得到的状态不是 C、U、D。 如果我更改 Predicate condition2 行——我会得到我期望的结果??

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

MySQL 驱动程序或 Eclipselink 是否存在错误?还是我的想法有问题?

My hope is to retrieve from ActiivtyLog where divsion = div and status IN (C,U,D)

最佳答案

为什么要使用 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) );

关于mysql - 使用 IN 语句的 Eclipselink JPA 类型安全查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10526362/

相关文章:

java - 使用 JPA 2.0 标准查询 map

hibernate - JPA2 多对多关系上的级联删除

java - 多对多查询jpql

java - 无法确定关系属性的目标实体

python - mod_python/MySQL 在插入大量数据时出现错误 : "OperationalError: (2006, ' MySQL server has gone away')"

PHP.net 说 md5() 和 sha1() 不适合作为密码?

mysql - 如何选择搭乘同一机型的乘客?

mysql - count 方法根据条件中的日期返回不同的值

rest - jpa:合并多对多以前的记录时被删除

java - Eclipse 链接共享与 protected 缓存