반응형
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
반응형