JPQL 기본 함수

JPQL의 기본 함수 사용법과 사용자 정의 함수 등록 방법을 예제와 함께 자세히 설명합니다.

* JPQL 기본 함수

-CONCAT

-SUBSTRING

-TRIM

-LOWER, UPPER

-LENGTH

-LOCATE (인덱스 함수와 비슷하다.)

-- Result : 4
select locate('de', 'abcdefg') from Member m

-SIZE 

-- Team 에 속한 Member 들의 Collection 의 크기를 나타낸다.
select size(t.members) from Team t

 


 

-Custom 함수 등록

1. Dialect 파일 생성

package jpql;

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));

    }

}

 

2. persistence.xml 파일에 등록

<?xml version="1.0" encoding="UTF-8"?>
<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="org.hibernate.dialect.H2Dialect"/>-->
            <property name="hibernate.dialect" value="jpql.MyH2Dialect"/>


            <!-- 옵션 -->
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.use_sql_comments" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="create" />
        </properties>
    </persistence-unit>
</persistence>

 

3. 실행 예제

    public static void main(String[] args) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();
        tx.begin();

        try {

            Member member = new Member();
            member.setUsername("heejae");
            member.setAge(20);

            em.persist(member);

            String query = "select function('group_concat', m.username) from Member m";

            List<String> result = em.createQuery(query, String.class).getResultList();

            for(String r : result) {
                System.out.printf("r : " + r);
            }


            tx.commit();

        } catch (Exception e) {

            tx.rollback();

        } finally {

            if(em.isOpen()) {
                em.close();
            }

        }

        if(emf.isOpen()) {
            emf.close();
        }
    }

 


이것도 읽어보세요