首页 > 解决方案 > javax.persistence.criteria.CriteriaBuilder#or 是如何工作的?

问题描述

我创建了一个自定义存储库来过滤来自数据库的实体列表。以下是已实现类的基本初始化(实体简化为字母以进行说明):

@Repository
public class CustomXRepositoryImpl implements CustomXRepository {

    private final EntityManager em;
    private final CriteriaBuilder builder;
    private final CriteriaQuery<X> query;
    private final Root<X> root;

    @Autowired
    public CustomXRepositoryImpl(EntityManager em) {
        this.em = em;
        builder = em.getCriteriaBuilder();
        query = builder.createQuery(X.class);
        root = query.from(X.class);
    }
}

和我实施的方法:

@Override
public List<X> filter(FilterParams params) {

    List<Predicate> restrictions = new ArrayList<>();

    // some if-statements ...

    if (params.getY() != null) {
        Expression<?> path1 = root.get("a").get("b").get("y");
        Expression<?> path2 = root.get("c").get("d").get("y");
        Predicate p1 = builder.equal(path1, params.getY());
        Predicate p2 = builder.equal(path2, params.getY());
//        restrictions.add(p1); // 3 results for Y = 4
//        restrictions.add(p2); // no result for Y = 4
        restrictions.add(builder.or(p1, p2)); // no result
    }

    // more if-statements ...

    query.where(restrictions.toArray(new Predicate[0]));
    return em.createQuery(query).getResultList();
}

让我感到困惑的是builder.or(p1, p2),即使p1满意,也没有返回结果。我还发现 CriteriaBuilder#or文档返回给定限制谓词的析取)非常模棱两可。

谁能解释这种行为?

标签: spring-bootjpajava-8hibernate-criteriacriteria-api

解决方案


推荐阅读