【问题标题】:Jpa QueryBuilder Multiple expressions in where clause not workingJpa QueryBuilder where子句中的多个表达式不起作用
【发布时间】:2011-09-27 19:44:30
【问题描述】:

我在使用 javax.persistence.criteria.CriteriaBuilder 创建查询时遇到问题。我正在使用 EclipseLink 2.1 和 Oracle 10g 数据库。在构建具有多个限制的查询时,它将仅使用第一个限制,而不是两者。

这是我的代码:

CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<Assignment> query = cb.createQuery(Assignment.class);
Root<Assignment> assignment = query.from(Assignment.class);

query.where(
    cb.equal(assignment.get("request"), request),
    cb.isNull(assignment.get("endDate")));

return getEm().createQuery(query).getResultList();

产生的查询是:

SELECT ASSX_ID, END_DATE, BEGIN_DATE, COMMENTS, 
       ASSX_OER_ASSIGNED_TO_ID, OER_OER_ID_ASSIGNED_BY, 
       ASSX_RQST_ID 
FROM TARTS.ASSIGNMENT_XREF 
WHERE (ASSX_RQST_ID = ?)

看起来不错,除了 where 子句。我期待:

SELECT ASSX_ID, END_DATE, BEGIN_DATE, COMMENTS, 
       ASSX_OER_ASSIGNED_TO_ID, OER_OER_ID_ASSIGNED_BY, 
       ASSX_RQST_ID FROM TARTS.ASSIGNMENT_XREF 
WHERE (ASSX_RQST_ID = ? AND BEGIN_DATE IS NOT NULL)

我是否使用 cb.and(arg1, arg2) 也没关系。难道我做错了什么?任何帮助将不胜感激。

【问题讨论】:

  • 你的 cb.isNull 应该是 isNotNull。您是否尝试添加更多限制和/或尝试明确定义您的连词?

标签: criteria jpa-2.0 eclipselink query-builder


【解决方案1】:

您的查询看起来完全正常。正如您所提到的,CriteriaQuery.where(Predicate... restrictions) 已经使用了谓词的连词,因此无需使用 cb.and()。

我能想到的唯一的事情:

  • EclipseLink 中的错误(尝试与 Hibernate 相同)
  • 某种优化,也许endDate 可能永远不会为空?
  • 你的 getEm() 方法做了一些奇怪的事情

【讨论】:

猜你喜欢
  • 2010-12-17
  • 1970-01-01
  • 2016-07-24
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2021-09-04
相关资源
最近更新 更多