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()方法中:
@Test
public void Criteria_OrderByAsc() {
    EntityManager em = emf.createEntityManager();
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery sql = cb.createQuery(Employee.class);
    Root emp = sql.from(Employee.class);
    sql.select(emp);
    Order salaryOrder = cb.asc(emp.get(Employee_.salary));
//  Order salaryOrder = cb.desc(emp.get(Employee_.salary));
    sql.orderBy(salaryOrder);
    TypedQuery typedQuery = em.createQuery(sql);
    List resultList = typedQuery.getResultList();
    resultList.forEach(System.out::println);
    em.close();
    assertThat(resultList, contains(employee3, employee1, employee2));
}
前述範例等價於使用以下JPQL查詢:
SELECT e FROM Employee e ORDER BY e.salary
// SELECT e FROM Employee e ORDER BY e.salary ASC

多欄位排序

CriteriaQuery的orderBy()方法中可以接受多個Order物件,並使用不同的asc()或desc(),如以下範例程式行8、9,以完成多欄位排序:
@Test
public void Criteria_OrderByMultiColumns() {
    EntityManager em = emf.createEntityManager();
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery sql = cb.createQuery(Employee.class);
    Root emp = sql.from(Employee.class);
    sql.select(emp)
        .orderBy( cb.asc(emp.get(Employee_.dept)), 
                cb.desc(emp.get(Employee_.salary)) );
    TypedQuery typedQuery = em.createQuery(sql);
    List resultList = typedQuery.getResultList();
    resultList.forEach(System.out::println);
    em.close();
    assertThat(resultList, contains(employee2, employee1, employee3));
}
前述範例等價於使用以下JPQL查詢:
SELECT e FROM Employee e ORDER BY e. dept ASC, e.salary DESC

沒有留言:

張貼留言