spring-boot - 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文档(返回给定限制谓词的析取)非常模棱两可。
谁能解释这种行为?
解决方案
推荐阅读
- hex - 十六进制地址范围如何等于字节大小?
- algorithm - 这个嵌套 for 循环的运行时间是多少?
- php - 使用 PHP 的多语言网站无法在实时服务器上运行,只有 Vagrant
- python - 类默认输出值
- javascript - 即使在重新加载角度 6 时也能在所有组件中维护对象实例的最佳方式
- amazon-web-services - AWS C9 - 您的环境已用完配额。请腾出一些空间
- angularjs - AngularJS图像未显示在屏幕上
- java - Visual Studio Code 可以增量编译 Java Web 应用项目吗?
- input - 跟踪简单输入字段的简单方法?
- php - Laravel 在 Storage 中找不到 PDF 文件