1

複数のおよび/または条件に問題があります。これが状況です。ユーザー、dateFrom、およびdateToフィールドを持つWorkTimeエンティティと、organizationUnitフィールドを持つユーザーエンティティがあります。これらの日付が重なる日付を含む日付間の作業時間を取得するために、次のクエリを作成しています。

// 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 では動作しないのではないかと心配しています。

4

1 に答える 1