【问题标题】:How to use Criteria API objects for multiple and/or conditions如何将 Criteria API 对象用于多个和/或条件
【发布时间】:2013-06-07 06:23:45
【问题描述】:

我遇到了多个和/或条件的问题。情况就是这样,我有带有 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。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      • 2014-05-15
      • 2022-12-21
      • 2017-04-13
      • 1970-01-01
      • 2011-03-17
      • 2010-12-20
      相关资源
      最近更新 更多