JPA条件查询中的复合谓词-同时使用and、or方法

JPA条件查询中的复合谓词-同时使用and、or方法,jpa,criteria,predicate,criteria-api,Jpa,Criteria,Predicate,Criteria Api,要求:有一些初始条件。假设P1是谓词。 数据库表中有一个日期字段,该字段可能为空。如果它为null,我可以继续使用初始谓词本身。如果不为null,则该字段的值必须介于指定日期之间 方法1: 我试图在查询中同时使用“和”“或”条件。问题在于谓词的组合 Predicate P1 = criteriaBuilder.equal(a,b); Predicate P2 = criteriaBuilder.isNull(myDate); Predicate P3 = criteriaBuilder.isNo

要求:有一些初始条件。假设P1是谓词。 数据库表中有一个日期字段,该字段可能为空。如果它为null,我可以继续使用初始谓词本身。如果不为null,则该字段的值必须介于指定日期之间

方法1: 我试图在查询中同时使用“和”“或”条件。问题在于谓词的组合

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和(P2或(P3和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


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

在这两种情况下,预期条件和实际条件是等效的。表达式从左到右求值,
优先于

查看您的第一个查询(带括号和不带括号),以下组合将生成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));