集合的 CriteriaBuilder 和 CriteriaQuery 之间的区别
Posted
技术标签:
【中文标题】集合的 CriteriaBuilder 和 CriteriaQuery 之间的区别【英文标题】:Difference between CriteriaBuilder and CriteriaQuery for a Collection 【发布时间】:2014-01-27 14:24:20 【问题描述】:有什么区别:
criteriaBuilder.in(predicate); criteriaQuery.where(predicate);这似乎给出了相同的结果。我错过了什么吗?我们应该选择查询上方的构建器吗?
完整示例:
List<String> names = new ArrayList<String>();
names.add("John");
names.add("Emma");
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<PersonEntity> criteriaQuery = criteriaBuilder.createQuery(PersonEntity.class);
Root<PersonEntity> root = criteriaQuery.from(PersonEntity.class);
Predicate predicate = root.get(PersonEntity_.name).in(names);
criteriaBuilder.in(predicate);
// or alternative: criteriaQuery.where(predicate);
List<PersonEntity> list = entityManager.createQuery(cq).getResultList();
【问题讨论】:
【参考方案1】:criteriaBuilder.in(predicate) 创建一个新的谓词。如果将谓词添加到查询中,您应该向您的提供者提交错误,因为这将不可移植。根据规范,它创建一个新的谓词,就像 root.get(PersonEntity_.name).in(names) 一样。只有通过调用条件查询.where(predicate) 等方式添加到谓词时,查询才应使用谓词。
【讨论】:
以上是关于集合的 CriteriaBuilder 和 CriteriaQuery 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
使用 CriteriaBuilder 的 JPA 计数(*)。如何使用 CriteriaBuilder 检索 count(*) 列
CriteriaBuilder 和/或条件未应用必需/正确的括号