JPA条件查询中的条件where子句

JPA条件查询中的条件where子句,jpa,where-clause,predicate,criteria-api,conditional-statements,Jpa,Where Clause,Predicate,Criteria Api,Conditional Statements,我面临一个JPA标准查询的问题。如何使用if-else在条件查询中添加多个where子句 我的要求是: CriteriaBuilder builder = getEm().getCriteriaBuilder(); CriteriaQuery<Object> query = builder.createQuery(Object.class); // From Root<EntityClass> entity= query.from(EntityClass.class);

我面临一个JPA标准查询的问题。如何使用if-else在条件查询中添加多个where子句

我的要求是:

CriteriaBuilder builder = getEm().getCriteriaBuilder();
CriteriaQuery<Object> query = builder.createQuery(Object.class);

// From
Root<EntityClass> entity= query.from(EntityClass.class);
// Select
query.multiselect(entity.get("id").get("col1"),entity.get("id").get("col2"));
// Where
Predicate p1 = builder.and(builder.equal(entity.get("col3"), value3));
Predicate p2 = builder.and(builder.equal(entity.get("col4"), value4));
Predicate p3 = builder.and(builder.equal(entity.get("col5"), value5));
if(someCondition1){
    query.where(p1);
}else if(someCondition2){
    query.where(p1);
}
query.where(p3);
但这不是一个好方法,因为当有很多if-else时,编写重复代码会变得非常糟糕。任何人都能找到解决办法吗?

类似这样的:

Predicate p;
Predicate p3 = builder.equal(entity.get("col5"), value5);
if(someCondition1){
    p = builder.equal(entity.get("col3"), value3);
}else if(someCondition2){
    p = builder.equal(entity.get("col4"), value4);
}
if (p != null) p = builder.and(p, p3);
else p = p3;
query.where(p);

因此,不要在每个if中调用where,只需构建一个完整的表达式,并在末尾调用where一次。

您可以创建一个谓词数组来存储条件谓词,然后将其添加到
where
子句:

List<Predicate> predList = new LinkedList<Predicate>();
if (someCondition1) {
    predList.add(p1);
} else if (someCondition2) {
    predList.add(p2);
}
predList.add(p3);
Predicate[] predArray = new Predicate[predList.size()];
predList.toArray(predArray);
query.where(predArray);
List predList=newlinkedlist();
如果(1){
predList.add(p1);
}else if(someCondition2){
predList.add(p2);
}
添加(p3);
谓词[]predArray=新谓词[predList.size()];
predList.toArray(predArray);
query.where(predArray);

这允许动态添加任何类型的谓词。

但是这里仍然有大量的if/elseIn,我们如何添加和有条件地添加?我们可以通过指定另一个谓词列表来使用相同的方法吗?
List<Predicate> predList = new LinkedList<Predicate>();
if (someCondition1) {
    predList.add(p1);
} else if (someCondition2) {
    predList.add(p2);
}
predList.add(p3);
Predicate[] predArray = new Predicate[predList.size()];
predList.toArray(predArray);
query.where(predArray);