CriteriaBuilder和CriteriaQuery之间的区别

时间:2014-01-27 14:24:20

标签: jpa collections where criteriaquery

有什么区别:

  • criteriaBuilder.in(谓词);
  • criteriaQuery.where(谓词);

这似乎给出了相同的结果。我错过了什么吗?我们应该在查询上方选择构建器吗?

完整示例:

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 个答案:

答案 0 :(得分:1)

criteriaBuilder.in(谓词)创建一个新谓词。如果将谓词添加到查询中,则应该向提供程序提交错误,因为这不可移植。根据规范,它创建一个新的谓词,就像root.get(PersonEntity_.name).in(names)一样。查询应该仅在谓词添加到谓词时使用,例如通过调用criteriaQuery.where(谓词)。