本文為【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呈現。
沒有留言:
張貼留言