Programming/JPA

JPA - 기본 문법 (조건식(CASE 등등), JPQL 함수)

잇(IT) 2023. 7. 18. 15:39

- 조건식 - 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 프로그래밍 - 기본편)

728x90