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에서 풀어내기때문에 별로 쓰지는 않는다.
(그래도 공부한 내용이니 정리해보았다~~)