gah*_*ggs 8 jpa predicate where-clause 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);
// 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);
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,语句query.where(p3); 替换先前设置的where子句条件p1和p2.我发现的替代品是如下所示
if(someCondition1){
query.where(p1, p3);
}else if(someCondition2){
query.where(p2, p3);
}else{
query.where(p3);
}
Run Code Online (Sandbox Code Playgroud)
但这不是一个好方法,因为当有很多if-else时,编写重复代码变得非常糟糕.任何人都可以为此解决问题吗?
小智 20
您可以创建一个Predicate数组来存储条件谓词,然后将其添加到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);
Run Code Online (Sandbox Code Playgroud)
这允许动态添加任何类型的谓词.
像这样的东西:
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);
Run Code Online (Sandbox Code Playgroud)
因此,不要在每个地方调用,只需构建一个完整的表达式并在最后调用一次.
| 归档时间: |
|
| 查看次数: |
21645 次 |
| 最近记录: |