1. 개요

JPA Criteria API는 데이터베이스에서 레코드를 쿼리할 때 여러 AND/OR 조건을 쉽게 추가하는 데 사용할 수 있습니다. 이 사용방법(예제)에서는 여러 AND/OR 술어를 결합하는 JPA 기준 쿼리의 간단한 예를 살펴보겠습니다.

조건자에 익숙하지 않은 경우 먼저 기본 JPA 기준 쿼리 에 대해 읽어보는 것이 좋습니다 .

2. 샘플 신청

예제에서는 각각 id, name , colorgrade 가 있는 항목 엔터티 의 인벤토리를 고려합니다 . 

@Entity
public class Item {

    @Id
    private Long id;
    private String color;
    private String grade;
    private String name;
    
    // standard getters and setters
}

3. AND 술어 를 사용 하여 두 개의 OR 술어 결합

다음 두 가지를 모두 포함하는 항목을 찾아야 하는 시나리오를 고려해 보겠습니다.

  1. 빨간색 또는 파란색 색상
    AND
  2. 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 술어 결합

반대로 다음 중 하나가 있는 항목을 찾아야 하는 시나리오를 고려해 보겠습니다.

  1. 빨간색 및 등급 D
    또는
  2. 파란색과 등급 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 에서 사용할 수 있습니다 .

Persistence footer banner