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查詢時:
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));
}
說明

  • 行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呈現。

沒有留言:

張貼留言