JPA Criteria Query中的复合谓词 - 使用两者和/或方法

时间:2014-06-19 20:06:31

标签: jpa criteria predicate criteria-api

要求:有一些初始条件。小册子说P1是谓词。 数据库表中有一个日期字段,可以为null。如果它为null,我可以继续使用初始谓词。如果它不为null,则该字段的值必须在指定日期之间。

Approach1: 我试图同时使用'和' '或'我的查询中的条件。问题在于谓词组合。

Predicate P1 = criteriaBuilder.equal(a,b);
Predicate P2 = criteriaBuilder.isNull(myDate);
Predicate P3 = criteriaBuilder.isNotNull(myDate);
Predicate P4 = criteriaBuilder.between(currentDate,previousDate);


Predicate P34 = criteriaBuilder.and(P3,P4);
Predicate P234 = criteriaBuilder.or(P2,P34);
Predicate P1234 = criteriaBuilder.and(P1,P234);
criteriaBuilder.where(P1234);

查询中的预期条件:P1 AND(P2 OR(P3 AND P4))

查询中的实际情况:P1和P2或P3和P4

方法2:使用一些数学集理论并扩展括号。

Predicate P12 = criteriaBuilder.and(P1,P2);
Predicate P34 = criteriaBuilder.and(P3,P4);
Predicate P134 = criteriaBuilder.and(P1,P34);
Predicate P12134 = criteriaBuilder.or(P12,P134);
criteriaBuilder.where(P12134);

查询中的预期条件:(P1和P2)或(P1和P3和P4)

查询中的实际条件:P1和P2或P1和P3和P4

在这两种方法中,我都缺少括号。建议我获得这些括号的方法。有没有更好的方法来满足要求??

1 个答案:

答案 0 :(得分:2)

在这两种情况下,预期条件和实际条件是相同的。表达式从左到右进行评估,AND优先于OR

查看您的第一个查询,包括括号和不包括括号,以下组合产生true,而所有其他组合将产生false:

SELECT true AND true OR true AND true;
SELECT true AND false OR true AND true;
SELECT true AND true OR false AND false;

SELECT true AND (true OR (true AND true));
SELECT true AND (false OR (true AND true));
SELECT true AND (true OR (false AND false));