공부/JPA

JPA 객체지향 쿼리 언어(JPQL) - JPQL 타입 표현과 기타식

데부한 2022. 7. 18. 22:03
반응형

출처 : 자바 ORM 표준 JPA 프로그래밍 인프런 강의

 

JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다.

 

JPQL 타입 표현과 기타식

JPQL 타입 표현

  • 문자 : 'HELLO', 문자 내 싱글 쿼테이션(')을 표시하고 싶을 경우 싱글 쿼테이션을 두 개 써주면 된다. → 'She''s'
  • 숫자 : 10L(Long), 10D(Double), 10F(Float)
  • Boolean : TRUE, FALSE
  • ENUM : jpabook.MemberType.Admin (패키지명 포함)
  • 엔티티 타입 : TYPE(m) = Member (상속 관계에서 사용)

예제

String query = "select m.username, 'HELLO', TRUE from  Member m";

위와 같이 쿼리를 만들면 각각의 값들이 잘 뽑혀나오는 걸 확인할 수 있다.

// 출력 로그
Hibernate: 
    /* select
        m.username,
        'HELLO',
        TRUE 
    from
        Member m */ select
            member0_.username as col_0_0_,
            'HELLO' as col_1_0_,
            1 as col_2_0_ 
        from
            Member member0_
objects[0] = teamA
objects[1] = HELLO
objects[2] = true

참고로 임의로 컬럼 기술 부분에 넣은 값들은 DB에 저장되진 않는다.

 

ENUM 타입은 실습을 위해 Member와 관련된 ENUM 클래스를 생성한다.

public enum MemberType {
    ADMIN, USER
}

그리고 Member 클래스에 MemberTpye을 가져온다.

@Enumerated(EnumType.STRING)
private MemberType type;

그리고 실행 클래스에서 member 객체에 MemberType을 세팅해준다.

member.setType(MemberType.ADMIN);

그리고 쿼리를 아래와 같이 작성한다.

String query = "select m.username, 'HELLO', TRUE from  Member m" +
                " where m.type = jpql.MemberType.ADMIN";

쿼리가 제대로 나가고, 값이 제대로 출력되면 조건에 맞는 값을 조회해 온거니 정상적으로 작동된 것이다.

// 출력 로그
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' //** ENUM 조건
objects[0] = teamA
objects[1] = HELLO
objects[2] = true

만약 member의 type을 ADMIN이 아닌 USER로 주면 List를 돌며 object[]의 값을 꺼내는 출력문이 보여지지 않을 것이다.

그런데 위의 방식은 패키지명을 적어야하는게 여간 귀찮은게 아니다. 대부분 실무에서는 위의 방식보다는 그냥 파라미터 방식으로 빼서 사용한다.

String query = "select m.username, 'HELLO', TRUE from  Member m" +
                " where m.type = :userType";
List<Object[]> result = em.createQuery(query)
        .setParameter("userType", MemberType.ADMIN)
        .getResultList();

 

 

JPQL 기타

  • SQL과 문법이 같은 식
  • EXISTS, IN
  • AND, OR, NOT
  • =, >, >=, <, <=, <>
  • BETWEEN, LIKE, IS NULL
반응형