JPA/JPA 기본

45. JPQL 함수

sdafdq 2023. 10. 31. 11:59

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