본문 바로가기

JPA/JPQL

JPQL에서의 Enum과 조건식

Student.java

package hellojpa;

import lombok.AccessLevel;
import lombok.Data;
import lombok.Setter;

import javax.persistence.*;

@Entity
@Data
public class Student {

    @Id @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;

    private String name;

    private int age;

    @Embedded
    private Address address;

    @Setter(AccessLevel.PROTECTED)
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "CLUB_ID")
    Club club;

    @Enumerated(EnumType.STRING)
    SchoolType school;

    void changeClub(Club club) {
        this.setClub(club);
        club.getStudents().add(this);
    }
}

 

Enum

JPQL

String query = "select s from Student s where s.school = hellojpa.SchoolType.HIGH";
List<Object[]> students = em.createQuery(query).getResultList();

JPQL로 Enum을 비교할 때는 Enum의 패키지명부터 시작해서 Enum 속성까지 직접 입력해야 한다.

String query = "select s from Student s where s.school = :school";
List<Object[]> students = em.createQuery(query)
      .setParameter("school", SchoolType.HIGH)
      .getResultList();

파라미터 바인딩을 사용하는 경우에는 위 코드처럼 사용가능하다.

String query = "select s from Student s where s.school = 'HIGH'";
List<Object[]> students = em.createQuery(query).getResultList();

또한 @Enumerated에서 String 전략으로 지정한 경우 위와 같이 String으로 조회할 수도 있다.
하지만 Enum의 필드명이 바뀔 경우 JPQL도 같이 고쳐주어야 하므로 잘 고려하고 사용하자!!

 

CASE

String query = "select case s.school " +
        "when 'ELEMENTARY' then '초등학생'" +
        "when 'MIDDLE' then '중학생'" +
        "when 'HIGH' then '고등학생'" +
        "end from Student s";
List<Object[]> school = em.createQuery(query, String.class).getResultList();

참고로 case 구문에서는 enum 값을 상수로 지정해줘야 동작한다.
사실 이런 case문의 경우 보통 application에서 풀어내기때문에 별로 쓰지는 않는다.

(그래도 공부한 내용이니 정리해보았다~~)

'JPA > JPQL' 카테고리의 다른 글

N+1과 fetch join  (0) 2021.10.02
경로표현식  (0) 2021.10.02
JPQL 함수  (0) 2021.09.25
서브쿼리  (0) 2021.09.16
조인  (0) 2021.09.15