2020年5月15日 星期五

使用Constructor敘述封裝複數欄位查詢結果

本文為【Spring Boot情境式網站開發指南:使用Spring Data JPA、Spring Security、Spring Web Flow】一書的【 第4章 Criteria API入門】延續,完整範例程式碼可至出版社下載

對於不是對Entity查詢單一欄位,或是全部欄位的情況,JPQL和Criteria API預設都是使用Object[]承接複數欄位的查詢結果,也都可以使用non-Entity類別將查詢結果封裝。使用以下JPQL查詢時:
  1. SELECT NEW entity.EmployeeInfo(e.name, e.salary) FROM Employee e
等價於使用以下Criteria API查詢:
  1. @Test
  2. public void Criteria_MultiColumnsWithConstructor1() {
  3. EntityManager em = emf.createEntityManager();
  4. CriteriaBuilder cb = em.getCriteriaBuilder();
  5. CriteriaQuery sql = cb.createQuery(EmployeeInfo.class);
  6. Root emp = sql.from(Employee.class);
  7. sql.select( cb.construct(EmployeeInfo.class,
  8. emp.get(Employee_.name),
  9. emp.get(Employee_.salary)) );
  10. TypedQuery typedQuery = em.createQuery(sql);
  11. List resultList = typedQuery.getResultList();
  12. resultList.forEach(System.out::println);
  13. em.close();
  14. assertThat(resultList,
  15. containsInAnyOrder(myEmp1, myEmp2, myEmp3, myEmp4, myEmp5));
  16. }
說明

  • 行5
CriteriaQuery須指定查詢結果以EmployeeInfo呈現。
  • 行7-9
  1. 使用CriteriaQuery的select()方法。
  2. CriteriaBuilder物件的construct()方法第一個參數指定使用EmployeeInfo為複數欄位的建構標的,後續參數為查詢的複數欄位。
  3. 也可以將行7~行9改用CriteriaQuery的multiselect ()方法:sql.multiselect(emp.get(Employee_.name), emp.get(Employee_.salary));其餘不變,語法更精簡。如方法Criteria_MultiColumnsWithConstructor2()。
  • 行10
TypedQuery也指定查詢結果以EmployeeInfo呈現。

沒有留言:

張貼留言