本文為【Spring Boot情境式網站開發指南:使用Spring Data JPA、Spring Security、Spring Web Flow】一書的【 第4章 Criteria API入門】延續,完整範例程式碼可至出版社下載
SQL的DISTINCT用來得到成員不重複的集合物件,因此成員類別必須覆寫hashCode()與equals()方法。
使用DISTINCT取出Entity物件的字串成員
使用以下JPQL查詢時:
SELECT DISTINCT e.dept FROM Employee e
等價於使用以下Criteria API查詢。因為只查詢一個欄位dept,行7使用CriteriaQuery的distinct(true)方法只會針對該欄位過濾重複值:
@Test
public void Criteria_DistinctColumn() {
EntityManager em = emf.createEntityManager();
CriteriaQuery sql = em.getCriteriaBuilder().createQuery(String.class);
Root emp = sql.from(Employee.class);
sql.select(emp.get(Employee_.dept))
.distinct(true);
TypedQuery typedQuery = em.createQuery(sql);
List resultList = typedQuery.getResultList();
resultList.forEach(System.out::println);
assertThat(resultList, contains("IT", "Admin"));
}
使用DISTINCT查詢多欄位
使用以下JPQL查詢時:
SELECT DISTINCT e.dept, e.salary FROM Employee e
ORDER BY e.dept ASC, e.salary DESC
等價於使用以下Criteria API查詢。多欄位的結果使用Object[ ]呈現:
@Test
public void Criteria_DistinctMultiColumns() {
EntityManager em = emf.createEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery
沒有留言:
張貼留言