[자바 ORM 표준 JPA 프로그래밍-기본편] JPQL 함수
jeonyoungho Oct 28, 2021 2021-10-28T00:00:00+09:00
Oct 29, 2021 2021-10-29T11:08:47+09:00 3 min
본 포스팅은 인프러의 JPA 기본편을 수강하고 정리하는 내용입니다.
JPQL 기본 함수
JPQL에서 제공하는 표준 함수이기에 데이터베이스에 관계없이 사용하면 된다.
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();
}
}
|
This post is licensed under
CC BY 4.0 by the author.