JPQL 타입 표현
- 문자: "HELLO" 등
- Boolean: TRUE, FALSE
- 숫자: 10L (Long), 10D (Double), 10F (Float)
- ENUM: jpql에서 ENUM 타입의 값을 조회할 때는 패키지명도 포함해서 작성
- 엔티티타입: 특정 엔티티 타입으로 조회 가능하다, 예를들어 Item을 상속한 Book, Album, Movie등이 있을때
특정 엔티티를 조회하기 위해서 엔티티타입을 이용할 수 있다.
예시)
ex) 문자, boolean, 숫자
selet m.username, "HELLO", true, 10L from Member m
ex) ENUM1
selet m.username, 'HELLO', true from Member m
where m.type = jpql.MemberType.ADMIN
위에서 "는 생략했지만 query는 String이다.
String 안에 이런식으로 패키지명 까지 하드코딩하기 싫다면 파라미터 바인딩 할 수 있다.
ex) ENUM2
String query = "selet m.username, 'HELLO', true from Member m
where m.type = :userType";
List<Object[]> result = em.createQuery(query)
.setParameter("userType", jpql.MemberType.ADMIN)
.getResultList();
:userType에 setParmeter() 메소드를 이용해서 파라미터 바인딩을 했다.
ex) 엔티티 타입
em.createQuery("select i from Item i where type(i) = Book", Item.class)
type() 을 황용하면 된다.
기타 (SQL과 문법이 같은 식)
- EXISTS, IN
- AND, OR, NOT
- =, >, >=, <, <=, <>
- BETWEEN, LIKE, IS NULL
CASE 식 (조건식)
1. 기본 CASE 식
String query = "select " +
"case when m.age <= 10 then '학생요금' " +
" when m.age >= 60 then '경로요금' " +
" else '일반요금' " +
"end " +
"from Member m";
List<String> resultList = em.createQuery(query, String.class)
.getResultList();
for (String str : resultList) {
System.out.println("str = " + str);
}
조건에 따라서 데이터를 나눠서 조회할 수 있고, 출력 결과 지정도 가능하다.
출력결과
2. 단순 CASE 식 (Exact 일치형)
String query = "select " +
"case m.username " +
"when '정석우' then '노력하는자' " +
"else '다른사람' " +
"end " +
"from Member m";
List<String> resultList = em.createQuery(query, String.class)
.getResultList();
for (String str : resultList) {
System.out.println("str = " + str);
}
case에 특정 속성이 특정 값과 일치하는지 확인하고 출력결과까지 지정해주는 case 식이다.
출력결과
3. 기타 CASE 식
COALESCE: 하나씩 조회해서 null이 이면 두번째 값 반환, null아니면 해당값 반환
NULLIF: 두 값이 같으면 null 반환, 다르면 첫번째 값 반환
* coalesce뜻: 합치다 연합하다.
ex) COALESCE
String query = "select coalesce(m.username, '이름이 없는 사람') from Member m";
List<String> resultList = em.createQuery(query, String.class)
.getResultList();
for (String str : resultList) {
System.out.println("str = " + str);
}
출력결과
ex) NULLIF
String query = "select nullif(m.username, '정둘') from Member m";
List<String> resultList = em.createQuery(query, String.class)
.getResultList();
for (String str : resultList) {
System.out.println("str = " + str);
}
출력결과
JPQL 기본함수
CONCAT
ex) select concat('a', 'b') ..
select 'a' || 'b' .. 와 같다
SUBSTRING
ex) substring(m.username, 1, 4) ...
-> 자바와 달리 인덱스가 0부터 시작하지 않고, 끝인덱스의 값도 포함한다.
TRIM
-> 공백제거
LOWER, UPPER
-> 소문자 대문자 교체
LENGTH
LOCATE
- locate(찾고자하는 값, 대상 인덱스)
- 리턴하는 값 형태는 Integer이고 인덱스의 첫 시작번호는 1이다.
ex)
select locate('de', 'abcdefg') from Member m
테이블로 조회해서 4를 두번 반환
ex)
select locate('석', m.username) from Member m
만약 찾는 값이 없으면 0반환 -> 2와 0반환
ABS, SQRT, MOD
SIZE, INDEX
index는 안 쓰는걸 추천
ex)
select size(t.members) from Team t
-> 컬렉션의 크기 반환 가능
사용자 정의함수
1. Dialect 패키지를 생성하고 커스텀 함수를 생성하고 관리할 Dialect 파일을 만든다.
MyH2Dialect class
package dialect;
import org.hibernate.dialect.H2Dialect;
import org.hibernate.dialect.function.StandardSQLFunction;
import org.hibernate.type.StandardBasicTypes;
public class MyH2Dialect extends H2Dialect {
public MyH2Dialect(){
registerFunction("group_concat", new StandardSQLFunction("group_concat", StandardBasicTypes.STRING));
}
}
2. 함수를 등록한다.
위와 같이 registerFunction으로 함수를 등록한다.
3. persistence의 property를 수정한다. 내가 만든 커스텀 다이얼럭트로 경로를 수정한다.
변경전
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
변경후
<property name="hibernate.dialect" value="dialect.MyH2Dialect"/>
이 게시물은 '자바 ORM 표준 JPA 프로그래밍' 강의를 수강하고 정리한 내용임을 밝힙니다.
출처: https://www.inflearn.com/course/ORM-JPA-Basic#
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 본 강의는 자바 백엔
www.inflearn.com