2020年5月8日 星期五

ORDER BY

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

Criteria API使用CriteriaBuilder的方法asc()做升冪(ascending)排序,使用方法desc()表示降冪(descending)排序。

使用asc()、desc()排序

以下範例行8使用CriteriaBuilder的方法asc()傳入salary欄位以建立升冪Order物件,行9則使用desc()建立降冪Order物件,可擇一使用;最終傳入CriteriaQuery的orderBy()方法中:
  1. @Test
  2. public void Criteria_OrderByAsc() {
  3. EntityManager em = emf.createEntityManager();
  4. CriteriaBuilder cb = em.getCriteriaBuilder();
  5. CriteriaQuery sql = cb.createQuery(Employee.class);
  6. Root emp = sql.from(Employee.class);
  7. sql.select(emp);
  8. Order salaryOrder = cb.asc(emp.get(Employee_.salary));
  9. // Order salaryOrder = cb.desc(emp.get(Employee_.salary));
  10. sql.orderBy(salaryOrder);
  11. TypedQuery typedQuery = em.createQuery(sql);
  12. List resultList = typedQuery.getResultList();
  13. resultList.forEach(System.out::println);
  14. em.close();
  15. assertThat(resultList, contains(employee3, employee1, employee2));
  16. }
前述範例等價於使用以下JPQL查詢:
  1. SELECT e FROM Employee e ORDER BY e.salary
  2. // SELECT e FROM Employee e ORDER BY e.salary ASC

多欄位排序

CriteriaQuery的orderBy()方法中可以接受多個Order物件,並使用不同的asc()或desc(),如以下範例程式行8、9,以完成多欄位排序:
  1. @Test
  2. public void Criteria_OrderByMultiColumns() {
  3. EntityManager em = emf.createEntityManager();
  4. CriteriaBuilder cb = em.getCriteriaBuilder();
  5. CriteriaQuery sql = cb.createQuery(Employee.class);
  6. Root emp = sql.from(Employee.class);
  7. sql.select(emp)
  8. .orderBy( cb.asc(emp.get(Employee_.dept)),
  9. cb.desc(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, contains(employee2, employee1, employee3));
  15. }
前述範例等價於使用以下JPQL查詢:
  1. SELECT e FROM Employee e ORDER BY e. dept ASC, e.salary DESC

沒有留言:

張貼留言