jpql에서 enum의 경우 표현하려면 "패키지.enum 클래스.enum 타입"으로 표현해야 한다.
Member.class
package jpql;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
@Entity
@Getter
@Setter
public class Member {
@Id @GeneratedValue
private Long id;
private String username;
private int age;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "TEAM_ID")
private Team team;
private MemberType type;
...
}
MemberType.enum
package jpql;
public enum MemberType {
ADMIN, USER
}
JpaMain.class
package jpql;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import java.util.List;
public class JpqlMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Team team = new Team();
team.setName("teamA");
Member member = new Member();
member.setUsername("memberA");
member.setAge(10);
member.setTeam(team);
em.persist(member);
em.flush();
em.clear();
String query = "select m.username, 'HELLO', true From Member m " +
"where m.type = jpql.MemberType.ADMIN";
List<Object[]> result = em.createQuery(query)
.getResultList();
for (Object[] objects : result) {
System.out.println("objects = " + objects[0]);
System.out.println("objects = " + objects[1]);
System.out.println("objects = " + objects[2]);
}
tx.commit();
} catch (Exception e) {
tx.rollback(); // 오류 발생 시 롤백
e.printStackTrace(); // 에러 내용 출력
} finally {
em.close(); // 종료
}
emf.close();
}
}
출력
Hibernate:
/* select
m.username,
'HELLO',
true
From
Member m
where
m.type = jpql.MemberType.ADMIN */ select
member0_.username as col_0_0_,
'HELLO' as col_1_0_,
1 as col_2_0_
from
Member member0_
where
member0_.type='ADMIN'
objects = memberA
objects = HELLO
objects = true
상속관계에서 오버라이딩을 통해서 엔티티를 조회하는 경우 Type()을 이용하여 엔티티 타입을 지정할 수 있다. 예를 들어 상위 클래스 Item을 하위클래스 Book이 상속받는다고 가정하자.
package jpabook.jpashop;
import jpabook.jpashop.domain.*;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Scanner;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try{
Book book = new Book();
book.setName("book");
book.setAuthor("author");
book.setIsbn("12345-12345-12345-12345");
em.persist(book);
List<Item> result = em.createQuery("select i from Item i where type(i) = Book", Item.class).getResultList();
Item findBook = result.get(0);
tx.commit();
} catch(Exception e) {
tx.rollback(); //오류 발생 시 롤백
} finally {
em.close();
}
emf.close();
}
}
결과
Hibernate:
/* select
i
from
Item i
where
type(i) = Book */ select
item0_.ITEM_ID as item_id2_5_,
item0_.createdBy as createdb3_5_,
item0_.createdDate as createdd4_5_,
item0_.modifiedBy as modified5_5_,
item0_.modifiedDate as modified6_5_,
item0_.name as name7_5_,
item0_.price as price8_5_,
item0_.stockQuantity as stockqua9_5_,
item0_1_.actor as actor1_7_,
item0_1_.director as director2_7_,
item0_2_.author as author1_1_,
item0_2_.isbn as isbn2_1_,
item0_3_.artist as artist1_0_,
item0_3_.etc as etc2_0_,
item0_.DTYPE as dtype1_5_
from
Item item0_
left outer join
Movie item0_1_
on item0_.ITEM_ID=item0_1_.ITEM_ID
left outer join
Book item0_2_
on item0_.ITEM_ID=item0_2_.ITEM_ID
left outer join
Album item0_3_
on item0_.ITEM_ID=item0_3_.ITEM_ID
where
item0_.DTYPE='Book'
'Spring > JPA' 카테고리의 다른 글
JPA- 경로 표현식 (0) | 2023.06.18 |
---|---|
JPA- 조건식의 사용 (0) | 2023.06.18 |
JPA- 조인 (0) | 2023.05.14 |
JPA- 페이징 (0) | 2023.05.13 |
JPA- 프로젝션 (0) | 2023.05.12 |