2020年7月19日 星期日

在WHERE敘述使用比較(Comparision)關鍵字:EMPTY

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

使用CriteriaBuilder的isEmpty()或isNotEmpty()方法可以查詢集合型態的物件欄位值是否為空(empty)。

使用 IS EMPTY 查詢

當JPQL使用以下查詢時:
  1. SELECT e FROM Employee1 e WHERE e.tasks IS EMPTY
對應的Criteria API用法如下:
  1. @Test
  2. public void Criteria_JoinedEntityIsEmpty() {
  3. EntityManager em = emf.createEntityManager();
  4. CriteriaBuilder cb = em.getCriteriaBuilder();
  5. CriteriaQuery sql = cb.createQuery(Employee1.class);
  6. Root emp1 = sql.from(Employee1.class);
  7. sql.select(emp1)
  8. .where( cb.isEmpty(emp1.get(Employee1_.tasks)) );
  9. List resultList = em.createQuery(sql).getResultList();
  10. resultList.forEach(System.out::println);
  11. em.close();
  12. assertThat(resultList, containsInAnyOrder(employee4, employee2));
  13. assertThat(resultList, hasSize(2));
  14. }
行8:
使用CriteriaBuilder的isEmpty()方法查詢集合型態的欄位Employee1_.tasks是否為空(empty)。

使用 IS NOT EMPTY 查詢

當JPQL使用以下查詢時:
  1. SELECT e FROM Employee1 e WHERE e.tasks IS NOT EMPTY
對應的Criteria API用法如下: 
  1. @Test
  2. public void Criteria_JoinedEntityIsNotEmpty() {
  3. EntityManager em = emf.createEntityManager();
  4. CriteriaBuilder cb = em.getCriteriaBuilder();
  5. CriteriaQuery sql = cb.createQuery(Employee1.class);
  6. Root emp1 = sql.from(Employee1.class);
  7. sql.select(emp1)
  8. .where( cb.isNotEmpty(emp1.get(Employee1_.tasks)) );
  9. List resultList = em.createQuery(sql).getResultList();
  10. resultList.forEach(System.out::println);
  11. em.close();
  12. assertThat(resultList, contains(employee1, employee3));
  13. assertThat(resultList, hasSize(2));
  14. }
行8:
使用CriteriaBuilder的isNotEmpty()方法查詢集合型態的欄位Employee1_.tasks是否不為空(empty)。

對一般欄位使用 IS NULL 敘述

對非集合物件型態的一般欄位應該使用使用isNull()方法判斷是否為空(null)。當JPQL使用以下查詢時:
  1. SELECT DISTINCT e FROM Employee1 e INNER JOIN e.tasks t WHERE t.name IS NULL
對應的Criteria API用法如下:
  1. @Test
  2. public void Criteria_JoinedEntityFieldIsEmpty() {
  3. EntityManager em = emf.createEntityManager();
  4. CriteriaBuilder cb = em.getCriteriaBuilder();
  5. CriteriaQuery sql = cb.createQuery(Employee1.class);
  6. Root emp1 = sql.from(Employee1.class);
  7. ListJoin tasks = emp1.join(Employee1_.tasks);
  8. sql.select(emp1)
  9. .distinct(true)
  10. .where(cb.isNull(tasks.get(Task_.name)));
  11. List resultList = em.createQuery(sql).getResultList();
  12. resultList.forEach(System.out::println);
  13. em.close();
  14. assertThat(resultList, contains(employee3));
  15. assertThat(resultList, hasSize(1));
  16. }
行10:
使用CriteriaBuilder的isNull()方法查詢非集合型態的欄位Task_.name是否為空(null)。

沒有留言:

張貼留言