concat : 합쳐라
substring : 잘라내라
trim : 맨 끝 공백 제거
lower, upper : 다 소문자, 혹은 다 대문자.
length : 문자열 길이
locate : 문자나 문자열의 위치
abs, sqrt, mod : abs(절대값), sqrt(제곱근), mod(나머지)
size, index(이것들은 JPA용임) :
위의 것 들은 JPA 표준이라 DB 관계없이 쓰면 됨.
그리고, 사용자 정의 함수
concat
List<String> result1 = em.createQuery("select concat('a','b') from Member m", String.class)
.getResultList();
for (String s : result1) {
System.out.println("s = " + s);
}
Hibernate:
/* select
concat('a','b')
from
Member m */ select
('a'||'b')
from
Member m1_0
s = ab
substring
List<String> result1 = em.createQuery("select substring('abcdef',2,3) from Member m", String.class)
.getResultList();
for (String s : result1) {
System.out.println("s = " + s);
}
인덱스 2 부터 3글자만
Hibernate:
/* select
substring('abcdef',2,3)
from
Member m */ select
substring('abcdef',2,3)
from
Member m1_0
s = bcd
trim
List<String> result1 = em.createQuery("select trim(' abcdef ') from Member m", String.class)
.getResultList();
for (String s : result1) {
System.out.println("s = " + s);
}
lTrim(leftTrim) 등도 쓸 수 있음.
Hibernate:
/* select
trim(' abcdef ') from Member m */ select
trim(BOTH from ' abcdef ')
from
Member m1_0
s = abcdef
upper, lower
List<String> result1 = em.createQuery("select upper('abcdef') from Member m", String.class)
.getResultList();
for (String s : result1) {
System.out.println("s = " + s);
}
Hibernate:
/* select
upper('abcdef')
from
Member m */ select
upper('abcdef')
from
Member m1_0
s = ABCDEF
length
List<Integer> result1 = em.createQuery("select length('abcdef') from Member m", Integer.class)
.getResultList();
for (Integer num : result1) {
System.out.println("num = " + num);
}
Hibernate:
/* select
length('abcdef')
from
Member m */ select
character_length('abcdef')
from
Member m1_0
num = 6
locate
List<Integer> result1 = em.createQuery("select locate('c','abcdef') from Member m", Integer.class)
.getResultList();
for (Integer s : result1) {
System.out.println("s = " + s);
}
두번째 인자에서 첫번째 인자의 위치
Hibernate:
/* select
locate('c','abcdef')
from
Member m */ select
locate('c','abcdef')
from
Member m1_0
s = 3
abs
List<Integer> result1 = em.createQuery("select abs(-17) from Member m", Integer.class)
.getResultList();
for (Integer s : result1) {
System.out.println("s = " + s);
}
Hibernate:
/* select
abs(-17)
from
Member m */ select
abs(-17)
from
Member m1_0
s = 17
sqrt
List<Double> result1 = em.createQuery("select sqrt(49) from Member m", Double.class)
.getResultList();
for (Double s : result1) {
System.out.println("s = " + s);
}
제곱근이 소수로도 구해져서 double타입으로 해야 함.
Hibernate:
/* select
sqrt(49)
from
Member m */ select
sqrt(49)
from
Member m1_0
s = 7.0
mod
List<Integer> result1 = em.createQuery("select mod(10,4) from Member m", Integer.class)
.getResultList();
for (Integer s : result1) {
System.out.println("s = " + s);
}
Hibernate:
/* select
mod(10,4)
from
Member m */ select
(10%4)
from
Member m1_0
s = 2
size
이건 JPA 전용인데,
List<Integer> result1 = em.createQuery("select size(t.members) from Team t ", Integer.class)
.getResultList();
for (Integer s : result1) {
System.out.println("s = " + s);
}
index
이것도 JPA 전용인데, @OrderColumn 이라고 엔티티 컬렉션 할 때 위치(id값 같은) 부여해 줄 수 있는.
그래서 잘 안씀.
@OrderColumn는 중간에 데이터 빠지면 거기 null 되고 그래서 쓰면 안좋음..
사용자 정의 함수.
이거는 DB에 사용자가 정의한 커스텀 함수를 사용할 수 있는거임.
일단 사용방법은
List<Integer> result1 = em.createQuery("select function('group_concat', t.members) from Team t ", Integer.class)
.getResultList();
저렇게 function('함수이름', 인자?) 하면 된다.
이게 하이버네이트5 -> 6 오면서
원래 여기에도 Dialect, 그러니까 방언 정의한 다음에, 우리가 H2Dialect 썼으니까 그거 상속 받아서 registerFunction 하면서 등록해서 썼어야 하는데,
지금은 그냥 써도 되는 듯 하다.
또 persistence.xml 에 dialect 부분에 H2Dialect가 아니라
내가 정의한 방언 클래스, 예를 들어 MyH2Dialect(H2Dialect 상속 받은)로 등록해야 함.
dialect.MyH2Dialect 해서
근데 이것도 안해도 될 듯.
그냥 쓰면 됨.
그냥 DB에 함수 정의하고,
그 이름 function() 해서 잘 맞춰서 쓰면 됨.
DB에 사용자 정의 함수 만드는 건
create function func(
인자 인자타입
)
is
begin
~~~~
return ~~~~
end
이런 식 인듯.
'JPA > JPA 기본' 카테고리의 다른 글
47. 페치 조인 기본 (0) | 2023.11.01 |
---|---|
46. 경로 표현식 (0) | 2023.11.01 |
44. 조건식. case 등등 (0) | 2023.10.31 |
43. JPA 타입 표현과 기타식 (0) | 2023.10.31 |
42. 서브쿼리 (0) | 2023.10.31 |