本文為【Spring Boot情境式網站開發指南:使用Spring Data JPA、Spring Security、Spring Web Flow】一書的【 第4章 Criteria API入門】延續,完整範例程式碼可至出版社下載
對於不是對Entity查詢單一欄位,或是全部欄位的情況,JPQL和Criteria API預設都是使用Object[]承接複數欄位的查詢結果,也都可以使用non-Entity類別將查詢結果封裝。使用以下JPQL查詢時:
SELECT NEW entity.EmployeeInfo(e.name, e.salary) FROM Employee e
等價於使用以下Criteria API查詢:
@Test
public void Criteria_MultiColumnsWithConstructor1() {
EntityManager em = emf.createEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery sql = cb.createQuery(EmployeeInfo.class);
Root emp = sql.from(Employee.class);
sql.select( cb.construct(EmployeeInfo.class,
emp.get(Employee_.name),
emp.get(Employee_.salary)) );
TypedQuery typedQuery = em.createQuery(sql);
List resultList = typedQuery.getResultList();
resultList.forEach(System.out::println);
em.close();
assertThat(resultList,
containsInAnyOrder(myEmp1, myEmp2, myEmp3, myEmp4, myEmp5));
}
說明
CriteriaQuery須指定查詢結果以EmployeeInfo呈現。
- 使用CriteriaQuery的select()方法。
- CriteriaBuilder物件的construct()方法第一個參數指定使用EmployeeInfo為複數欄位的建構標的,後續參數為查詢的複數欄位。
- 也可以將行7~行9改用CriteriaQuery的multiselect ()方法:sql.multiselect(emp.get(Employee_.name), emp.get(Employee_.salary));其餘不變,語法更精簡。如方法Criteria_MultiColumnsWithConstructor2()。
TypedQuery也指定查詢結果以EmployeeInfo呈現。
沒有留言:
張貼留言