Posts [자바 ORM 표준 JPA 프로그래밍-기본편] JPQL 함수
Post
Cancel

[자바 ORM 표준 JPA 프로그래밍-기본편] JPQL 함수

본 포스팅은 인프러의 JPA 기본편을 수강하고 정리하는 내용입니다.


JPQL 기본 함수

JPQL에서 제공하는 표준 함수이기에 데이터베이스에 관계없이 사용하면 된다.

  • CONCAT
1
2
3
String query = "select concat('a', 'b') from Member m";
List<String> resultList = em.createQuery(query, String.class)
        .getResultList();
  • SUBSTRING
  • TRIM
  • LOWER, UPPER
  • LENGTH
  • LOCATE: 해당 문자가 포함된 위치 반환
1
2
3
String query = "select locate('de', 'abcdegf') from Member m";
List<Integer> resultList = em.createQuery(query, Integer.class)
        .getResultList();
  • ABS, SQRT, MOD
  • SIZE, INDEX(JPA 용도)
    • SIZE: 컬렉션의 크기를 구해주는 함수
      1
      
      String query = "select size(t.members) from Team t";
      
    • INDEX: 값 타입 컬렉션의 위치(인덱스) 값을 구할 때 사용하는데 안쓰는게 좋다.

사용자 정의 함수 호출

  • 하이버네이트는 사용전 방언에 추가해야 한다.
    • 사용하는 DB 방언을 상속받고, 사용자 정의 함수를 등록한다.
      1
      
      select function('group_concat', i.name) from Item i
      
    • DB에 있는 함수를 불러다 써야할 때 표준 문법을 제공한다.
    • DB방언에 미리 추가해놔야함(하지만 기본적으로 DB별 내장 함수들이 대부분 다 등록되있긴하다)
  • 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
public class MyH2Dialect extends H2Dialect {

    public MyH2Dialect() {
        registerFunction("group_concat", new StandardSQLFunction("group_concat", StandardBasicTypes.STRING));
    }
}

<persistence version="2.2"
             xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
    <persistence-unit name="hello">
        <properties>
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="javax.persistence.jdbc.user" value="sa"/>
            <property name="javax.persistence.jdbc.password" value=""/>
            <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
            <property name="hibernate.dialect" value="dialect.MyH2Dialect"/>
            
            ...
    </persistence-unit>
</persistence>

public class JpaMain {
    public static void main(String[] args) {
        ...

        try {

            Team team = new Team();
            team.setName("teamA");
            em.persist(team);

            Member member = new Member();
            member.setUsername("관리자1");
            member.setAge(10);
            member.setType(MemberType.ADMIN);
            member.changeTeam(team);
            em.persist(member);

            Member member2 = new Member();
            member2.setUsername("관리자2");
            member2.setAge(10);
            member2.setType(MemberType.ADMIN);
            member2.changeTeam(team);

            em.persist(member2);

            em.flush();
            em.clear();
        
            // String query = "select group_concat(m.username) from Member m"; // 하이버네이트를 쓰면 이렇게도 사용가능
            String query = "select function('group_concat', m.username) from Member m";
            List<String> resultList = em.createQuery(query, String.class)
                    .getResultList();

            for (String s : resultList) {
                System.out.println("s = " + s);
            }
            
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            e.printStackTrace();
        } finally {
            em.close();
        }

        emf.close();
    }

}
  • 결과

image

This post is licensed under CC BY 4.0 by the author.

[자바 ORM 표준 JPA 프로그래밍-기본편] 조건식 (CASE 등등)

[자바 ORM 표준 JPA 프로그래밍-기본편] 경로표현식