2014-01-27 49 views
1

之间有什么区别:差异性集合

  • criteriaBuilder.in(谓语);
  • 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(谓词)创建一个新的谓词。如果将谓词添加到查询中,则应该向提供者提交错误,因为这不会是可移植的。根据规范,它创建一个新的谓词,就像root.get(PersonEntity_.name).in(names)一样。如果查询被添加到谓词中,例如通过调用criteriaQuery.where(谓词),该查询应该只使用谓词。