- 조건식 - CASE 식
- 기본 CASE 식
// 기본 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();
for (String s : result) {
System.out.println("s = " + s);
}
- COALESCE : 하나씩 조회해서 null이 아니면 반환
//coalesce
String query = "select coalesce(m.username, '이름 없는 회원') from Member m";
List<String> result = em.createQuery(query, String.class)
.getResultList();
for (String s : result) {
System.out.println("s = " + s);
}
- member의 username이 null이라는 가정하에 결과가 이름 없는 회원으로 나온 것을 확인할 수 있다.
- NULLIF : 두 값이 같으면 null 반환, 다르면 첫번째 값 반환
String query = "select nullif(m.username, '관리자') from Member m";
List<String> result = em.createQuery(query, String.class)
.getResultList();
for (String s : result) {
System.out.println("s = " + s);
}
- member의 username과 nullif의 값이 동일한 경우 -> 예를 들어 검색되면 안되는 조건 검색이 불가능하도록 하기 위해 사용한다.
- JPQL 함수
- 기본 member 값 설정
Member member1 = new Member();
member1.setUsername("관리자1");
em.persist(member1);
Member member2 = new Member();
member2.setUsername("관리자2");
em.persist(member2);
em.flush();
em.clear();
- JPQL 기본 함수
• CONCAT • SUBSTRING • TRIM • LOWER, UPPER • LENGTH • LOCATE • ABS, SQRT, MOD • SIZE, INDEX(JPA 용도)
- substring
String query = "select substring(m.username, 2,3) From Member m";
List<String> result = em.createQuery(query, String.class)
.getResultList();
for (String s : result) {
System.out.println("s = " + s);
}
- concat
String query = "select concat('a', 'b') From Member m";
List<String> result = em.createQuery(query, String.class)
.getResultList();
for (String s : result) {
System.out.println("s = " + s);
}
- locate
String query = "select locate('de','abcdefg') From Member m";
List<Integer> result = em.createQuery(query, Integer.class)
.getResultList();
for (Integer s : result) {
System.out.println("s = " + s);
}
- size
String query = "select size(t.members) From Team t";
List<Integer> result = em.createQuery(query, Integer.class)
.getResultList();
for (Integer s : result) {
System.out.println("s = " + s);
}
- 사용자 정의 함수 호출
1. 하이버네이트는 사용전 방언에 추가해야 한다.
2. 사용하는 DB 방언을 상속받고, 사용자 정의 함수를 등록한 다. select function('group_concat', i.name) from Item i
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));
}
}
- H2Dialect을 상속 받는 클래스 하나를 새롭게 생성해준다.
- 사용자 정의 함수는 H2Dialect 클래스를 참고하여 생성한다.
- persistence.xml
<!-- <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>-->
<property name="hibernate.dialect" value="dialect.MyH2Dialect"/> <!--사용자 정의 함수 사용시-->
- persistence.xml에서 데이터베이스 경로를 변경해준다.
String query = "select function('group_concat', m.username) From Member m";
List<String> result = em.createQuery(query, String.class)
.getResultList();
for (String s : result) {
System.out.println("s = " + s);
}
출처 : 인프런 - 우아한 형제들 기술이사 김영한의 스프링 완전 정복 (자바 ORM 표준 JPA 프로그래밍 - 기본편)
'Programming > JPA' 카테고리의 다른 글
JPA - 페치 조인 (1) (0) | 2023.07.19 |
---|---|
JPA - 경로 표현식 (0) | 2023.07.18 |
JPA - 기본 문법 (조인, 서브쿼리, 타입 표현과 기타식) (0) | 2023.07.18 |
JPA - 기본 문법과 기능 (기본 문법, 프로젝션, 페이징) (0) | 2023.07.18 |
JPA - 값 타입 컬렉션 (0) | 2023.07.17 |