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

Posted

技术标签:

【中文标题】使用 IN 语句的 Eclipselink JPA 类型安全查询【英文标题】:Eclipselink JPA Type-Safe Query using IN Statement 【发布时间】:2012-05-10 01:23:01 【问题描述】:

我设置了使用 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。 如果我更改 Predicate condition2 行——我会得到我期望的结果??

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

mysql 驱动程序或 Eclipselink 是否存在错误?还是我的想法有缺陷?

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

【问题讨论】:

【参考方案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) );

【讨论】:

...因为我很笨。使用不当。谢谢你。以为我需要equals,以防我想要“不在哪里”。

以上是关于使用 IN 语句的 Eclipselink JPA 类型安全查询的主要内容,如果未能解决你的问题,请参考以下文章

从子句中的jpa eclipselink子查询

JPA - EclipseLink - 如何更改默认模式

JPA 从 EclipseLink 到哪个提供商?

JPA - 使用 EclipseLink 保持单向一对多关系失败

JPA + EclipseLink+ HSQLDB 不创建表

使用 JPA (Eclipselink) 在 H2 数据库中执行全文搜索