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

标签 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);
// 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);

在上面的代码中,语句 query.where(p3);替换先前设置的 where 子句条件 p1 和 p2。我发现的替代品是像下面这样的结合
if(someCondition1){
    query.where(p1, p3);
}else if(someCondition2){
    query.where(p2, p3);
}else{
    query.where(p3);
}

但这不是一个好方法,因为当有很多 if-else 时,编写重复代码变得非常糟糕。任何人都可以解决这个问题吗?

最佳答案

您可以创建一个 Predicate 数组来存储您的条件 Predicates,然后将其添加到 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);
这允许动态添加任何类型的谓词。

关于jpa - JPA 条件查询中的条件 where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14097652/

相关文章:

session - 服务器集群中的 JPA 实体

java - JBoss AS 6 中 EntityManager 初始化之前的代码 Hook

WHERE 子句中的 MYSQL MIN

sql - 使用 where 子句中的函数的 Oracle 性能

php - WHERE 子句中的条件检查

java - 在 JPA 中分离对象

java - 如何使用 Spring security 从 Spring Data JPA 加载经过身份验证的用户实体模型以在其他 JPA 存储库中使用?

c# - 如何对与列表集合中的元素相关的字典进行排序 C#

android - NoClassDefFoundError : com/google/common/base/Predicate when importing MonkeyRunner in Jython

swift - Realm - 从 child 的角度获取所有 child 的所有 parent 的列表