지나공 : 지식을 나누는 공간
JPA 8 -3 : JPQL 타입 표현과 기타식, JPQL 기본 함수 본문
JPQL 타입 표현
- 문자 : 'HI', 'He''s' -> ' '안에 (')을 넣어야 할 때는 작은 따옴표 두 개 사용해서 표현
- 숫자 : 10L(Long), 10D(Double), 10F(Float)
- Boolean : true, false
- enum : 패키지명을 모두 포함해서 적어야 함.
public enum MemberType{
ADMIN, USER;
}
public class Member{
@Enumerated(EnumType.STRING)
private MemberType type;
//기본이 EnumType.ORDINAL이므로 항상 STRING으로 변경해주어야 함
}
String query = "select m.username from Member m " +
"where m.type = jpql.MemberType.ADMIN";
jpql.MemberType.ADMIN 처럼 enum의 패키지명을 적어야 한다.
- 엔티티타입 : Type(m) = Member (상속 관계에서 사용)
SQL 과 문법이 같은 식
- EXISTS, IN
- AND, OR, NOT
- =, >, >= , like between 등 모두 가능
조건식 - CASE 식
String query =
"select
case when m.age <= 10 then '학생요금'
when m.age >= 60 then '경로요금'
else '일반요금'
end
from Member m";
List<String> result = em.createQuery(query, String.class).getResultList();
- COALESCE : 하나씩 조회하다가 NULL이 아니면 반환
- NULLIF : 두 값이 같으면 NULL 반환, 다르면 첫째 값 반환
SELECT COALESCE(m.username, '이름 없는 회원') from Member m
select NULLIF(m.username, '관리자') from Member m
JPQL 기본 함수 - 데이터베이스에 관계없이 사용 가능
- CONCAT (문자 더하기) select 'a' || 'b' from Member m 또는 concat('a','b')
- SUBSTRING (문자를 잘라내기)
- TRIM (공백제거)
- LOWER
- UPPER
- LENGTH
- LOCATE : loacate('de', 'abcdef')는 4 반환 (1부터 시작)
- ABS, SQRT, MOD
- SIZE, INDEX(JPA 용도) : select size(t.members) from Team t 는 t의 멤버 수 반환
- index는 값 타입에서 컬렉션의 위치 값 구할 때 쓰는 건데 안 쓰는 게 좋다.
사용자 정의 함수 호출
위의 기본함수를 사용할 수 없을 때 사용자 정의 함수를 호출한다. 사용하는 DB 방언을 상속받고 사용자 정의 함수를 등록할 수 있다. MysqlDialect class를 보면 registerFunction으로 미리 등록된 것들이 있는데 이런 건 그냥 쓰면 된다. 하지만 없는 부분들은 아래처럼 등록해야 한다.
public class MyH2Dialect extends H2Dialect {
public MyH2Dialect(){
registerFunction("group_concat", new StandardSQLFunction("group_concat", StandardBasicTypes.STRING));
}
}
String query = "select function("group_concat", m.username) from Member m;
List<String> result = em.createQuery(query, Integer.class).getResultList();
//관리자1, 관리자 2 라는 하나의 String으로 반환됨
728x90
'Tech > JPA' 카테고리의 다른 글
DDD, Aggregate Root란? + JPA CasecadeType 영속성전이 (7) | 2022.09.18 |
---|---|
JPA Auditing 사용하기, BaseEntity로 생성일, 수정일 자동화 (0) | 2021.02.16 |
JPA 8 -2 : 조인, ON절, 서브쿼리, JPA 서브쿼리 한계 (0) | 2020.12.14 |
JPA 8 -1 : 프로젝션, 페이징 (0) | 2020.12.13 |
JPA 8 : JPQL 기본 문법과 쿼리 API (0) | 2020.12.09 |
Comments