java - 如何针对多个和/或条件使用 Criteria API 对象

标签 java jpa-2.0 java-ee-6 criteria-api

我遇到了多个和/或条件的问题。情况是这样的,我有带有 user、dateFrom 和 dateTo 字段的 WorkTime 实体以及带有organizationUnit 字段的 User 实体。我正在构建以下查询来获取日期之间的工作时间,包括那些与这些日期重叠的日期:

// main condition to get only users from given organizational unit
Predicate restriction = root.get(WorkTime_.user).get(User_.organizationalUnit).in((Object[]) orgUnits);

// first date condition to get work time between border dates
Predicate dateInRestr = builder.greaterThanOrEqualTo(root.get(WorkTime_.dateFrom), dateFrom);
dateInRestr = builder.and(dateInRestr, builder.lessThanOrEqualTo(root.get(WorkTime_.dateTo), dateTo));

// second date condition to get work time overlap border dates 
ParameterExpression<Date> dateFromParam = builder.parameter(Date.class);
ParameterExpression<Date> dateToParam = builder.parameter(Date.class);
Predicate dateOutRestr = builder.between(dateFromParam, root.get(WorkTime_.dateFrom), root.get(WorkTime_.dateTo));
dateOutRestr = builder.or(dateOutRestr, builder.between(dateToParam, root.get(WorkTime_.dateFrom), root.get(WorkTime_.dateTo)));

// OR for dates condition 
Predicate dateRestr = builder.or(dateInRestr, dateOutRestr);
// AND with unit condition
query.where(restriction, dateRestr);

一般情况下它工作正常,但 PostgreSQL 中的结果查询如下所示(仅显示条件部分):

and (user1_.ORG_UNIT_ID in (? , ? , ? , ? , ? , ?)) 
and (worktime0_.DATEFROM>=? and worktime0_.DATETO<=? 
    or ? between worktime0_.DATEFROM and worktime0_.DATETO
    or ? between worktime0_.DATEFROM and worktime0_.DATETO) 

我是否可以在 OR 条件元素周围添加额外的括号,以便查询如下所示:

and (user1_.ORG_UNIT_ID in (? , ? , ? , ? , ? , ?)) 
and ((worktime0_.DATEFROM>=? and worktime0_.DATETO<=?) 
    or (? between worktime0_.DATEFROM and worktime0_.DATETO)
    or (? between worktime0_.DATEFROM and worktime0_.DATETO)) 

或者从 SQL 的角度来看这并不重要?我担心它不适用于其他 RDMBS。

最佳答案

Criteria API 已为您返回有效的 SQL。它在需要的地方添加了括号,从我的仔细阅读来看,我看不出它会对任何其他 RDBMS 造成麻烦。

关于java - 如何针对多个和/或条件使用 Criteria API 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16977584/

相关文章:

java - 双括号初始化和序列化

java-ee-6 - CDI 和 JPA : Best scope for repository classes

java - 任何可以按照 ANSI x12 和 UN/EDIFACT 标准解析 EDI 文件的开源 Java 库?

java - JPA 2 + Criteria API + 获取子查询中最旧的元素

java - "org.hibernate.DuplicateMappingException"错误是什么意思?

java - 在类路径上使用 (SAXON-HE) 进行 JAXB 解码非常慢

java - OnLocationChanged() 不会自动调用。该位置未存储在数据库中

java - Spring 3.X Java 7 线程安全日期/数字格式注入(inject)

java - 使用 hibernate 的 JPA 2 标准查询无法左连接

spring - GWT开发人员模式+ Spring 3.1 + Hibernate 4.0.1中的异常