1. 개요
JPA Criteria API는 데이터베이스에서 레코드를 쿼리할 때 여러 AND/OR 조건을 쉽게 추가하는 데 사용할 수 있습니다. 이 사용방법(예제)에서는 여러 AND/OR 술어를 결합하는 JPA 기준 쿼리의 간단한 예를 살펴보겠습니다.
조건자에 익숙하지 않은 경우 먼저 기본 JPA 기준 쿼리 에 대해 읽어보는 것이 좋습니다 .
2. 샘플 신청
예제에서는 각각 id, name , color 및 grade 가 있는 항목 엔터티 의 인벤토리를 고려합니다 .
@Entity
public class Item {
@Id
private Long id;
private String color;
private String grade;
private String name;
// standard getters and setters
}
3. AND 술어 를 사용 하여 두 개의 OR 술어 결합
다음 두 가지를 모두 포함하는 항목을 찾아야 하는 시나리오를 고려해 보겠습니다.
- 빨간색 또는 파란색 색상
AND - A 또는 B 등급
JPA Criteria API의 and() 및 or() 복합 조건 자를 사용하여 이를 쉽게 수행할 수 있습니다 .
시작하려면 쿼리를 설정합니다.
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Item> criteriaQuery = criteriaBuilder.createQuery(Item.class);
Root<Item> itemRoot = criteriaQuery.from(Item.class);
이제 파랑 또는 빨강 색상이 있는 항목을 찾기 위해 술어 를 빌드해야 합니다 .
Predicate predicateForBlueColor
= criteriaBuilder.equal(itemRoot.get("color"), "blue");
Predicate predicateForRedColor
= criteriaBuilder.equal(itemRoot.get("color"), "red");
Predicate predicateForColor
= criteriaBuilder.or(predicateForBlueColor, predicateForRedColor);
다음으로 A 또는 B 등급 항목을 찾기 위해 술어 를 작성합니다.
Predicate predicateForGradeA
= criteriaBuilder.equal(itemRoot.get("grade"), "A");
Predicate predicateForGradeB
= criteriaBuilder.equal(itemRoot.get("grade"), "B");
Predicate predicateForGrade
= criteriaBuilder.or(predicateForGradeA, predicateForGradeB);
마지막으로 이 둘 의 AND 술어 를 정의하고 where() 메서드를 적용하고 쿼리를 실행합니다.
Predicate finalPredicate
= criteriaBuilder.and(predicateForColor, predicateForGrade);
criteriaQuery.where(finalPredicate);
List<Item> items = entityManager.createQuery(criteriaQuery).getResultList();
4. OR 술어 를 사용 하여 두 개의 AND 술어 결합
반대로 다음 중 하나가 있는 항목을 찾아야 하는 시나리오를 고려해 보겠습니다.
- 빨간색 및 등급 D
또는 - 파란색과 등급 B
논리는 매우 유사하지만 여기서는 먼저 두 개의 AND 술어 를 만든 다음 OR 술어 를 사용하여 결합합니다 .
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Item> criteriaQuery = criteriaBuilder.createQuery(Item.class);
Root<Item> itemRoot = criteriaQuery.from(Item.class);
Predicate predicateForBlueColor
= criteriaBuilder.equal(itemRoot.get("color"), "red");
Predicate predicateForGradeA
= criteriaBuilder.equal(itemRoot.get("grade"), "D");
Predicate predicateForBlueColorAndGradeA
= criteriaBuilder.and(predicateForBlueColor, predicateForGradeA);
Predicate predicateForRedColor
= criteriaBuilder.equal(itemRoot.get("color"), "blue");
Predicate predicateForGradeB
= criteriaBuilder.equal(itemRoot.get("grade"), "B");
Predicate predicateForRedColorAndGradeB
= criteriaBuilder.and(predicateForRedColor, predicateForGradeB);
Predicate finalPredicate
= criteriaBuilder
.or(predicateForBlueColorAndGradeA, predicateForRedColorAndGradeB);
criteriaQuery.where(finalPredicate);
List<Item> items = entityManager.createQuery(criteriaQuery).getResultList();
5. 결론
이 기사에서는 JPA Criteria API를 사용하여 AND/OR 술어를 결합해야 하는 사용 사례를 구현했습니다.
늘 그렇듯이 이 기사의 전체 소스 코드는 GitHub 에서 사용할 수 있습니다 .