JPA中的CriteriaQuery有什么作用?代码举例讲解

JPA中的CriteriaQuery用于创建特定域模型的类型安全查询。它有以下作用:

  1. 使用域模型的实体及属性创建查询,而不是使用字符串编写JPQL查询语句。更加类型安全。
  2. 支持创建动态查询,通过程序组装查询条件和选择项。更加灵活。
  3. 同样支持投影、聚合、分组、子查询等查询方式。功能等价于JPQL。
  4. 可以查看查询执行计划,进行查询优化。

代码示例:

基本查询:

CriteriaBuilder cb = em.getCriteriaBuilder();  
CriteriaQuery<User> cq = cb.createQuery(User.class);
Root<User> root = cq.from(User.class);
cq.select(root);  
TypedQuery<User> q = em.createQuery(cq);
List<User> users = q.getResultList();

条件查询:

CriteriaBuilder cb = em.getCriteriaBuilder();  
CriteriaQuery<User> cq = cb.createQuery(User.class);  
Root<User> root = cq.from(User.class);
cq.select(root).where(cb.equal(root.get("name"), "John"));  
TypedQuery<User> q = em.createQuery(cq);  
List<User> users = q.getResultList(); 

投影、聚合查询:

CriteriaBuilder cb = em.getCriteriaBuilder();  
CriteriaQuery<Object[]> cq = cb.createQuery(Object[].class);
Root<User> root = cq.from(User.class);
cq.multiselect(cb.count(root), cb.avg(root.<Integer>get("age"))); 
TypedQuery<Object[]> q = em.createQuery(cq); 
Object[] results = q.getSingleResult();
long count = (Long) results[0];  
double avg = (Double) results[1];