본문 바로가기

Spring/JPA

JPA-타입 표현

 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