복붙노트

[SPRING] JPA와 Hibernate로 SQL 함수 등록하기

SPRING

JPA와 Hibernate로 SQL 함수 등록하기

JPA / Hibernate로 사용자 정의 SQL 함수를 등록하는 가장 좋은 방법은 무엇인지 알고 싶습니다.

MysqlInnodb 방언을 확장해야합니까 아니면 더 좋은 방법이 있습니까?

누구든지 코드 샘플과 관련 문서에 대한 포인터를 제공 할 수 있습니까?

해결법

  1. ==============================

    1.그렇습니다. Dialect를 확장하는 것은 커스텀 SQL 함수를 등록하는 좋은 방법입니다.

    그렇습니다. Dialect를 확장하는 것은 커스텀 SQL 함수를 등록하는 좋은 방법입니다.

    Dialect 클래스 생성자에서 이와 비슷한 것을 추가하십시오.

    registerFunction("current_timestamp", new NoArgSQLFunction(Hibernate.TIMESTAMP) );
    registerFunction("date", new StandardSQLFunction(Hibernate.DATE) );
    

    기존의 방언 클래스 중 하나의 소스 코드를 살펴보십시오. http://www.koders.com/java/fid0E7F787E2EC52F1DA8DFD264EDFBD2DE904A0927.aspx

  2. ==============================

    2.이 기사에서 설명했듯이, Hibernate ORM 5.2.18과 5.3.1 이후 SQL 함수를 등록하는 가장 좋은 방법은 다음과 같이 MetadataBuilderContributor를 제공하는 것이다.

    이 기사에서 설명했듯이, Hibernate ORM 5.2.18과 5.3.1 이후 SQL 함수를 등록하는 가장 좋은 방법은 다음과 같이 MetadataBuilderContributor를 제공하는 것이다.

    public class SqlFunctionsMetadataBuilderContributor 
            implements MetadataBuilderContributor {
    
        @Override
        public void contribute(MetadataBuilder metadataBuilder) {
            metadataBuilder.applySqlFunction(
                "group_concat",
                new StandardSQLFunction(
                    "group_concat", 
                    StandardBasicTypes.STRING
                )
            );
        }
    }
    

    hibernate.metadata_builder_contributor 구성 등록 정보를 통해 Hibernate에 전달할 수있는 값은 다음과 같습니다.

    <property>
        name="hibernate.metadata_builder_contributor" 
        value="com.vladmihalcea.book.hpjp.hibernate.query.function.SqlFunctionsMetadataBuilderContributor"
    </property>
    

    또는 Hibernate를 기본적으로 부트 스트랩하는 경우, 부트 스트랩 중 SQL 함수를 MetadataBuilder에 적용하면됩니다.

  3. ==============================

    3.모든 버전의 SQL 메소드 등록

    모든 버전의 SQL 메소드 등록

            //Add Hibernate Properties
            properties.put("hibernate.dialect",
                            "com.sparkslink.web.config.sql.RegisterSqlFunction");
    
            //Create A Class 
            public class RegisterSqlFunction extends MySQLDialect {
    
                public RegisterSqlFunction() {
                    super();
                    registerFunction("group_concat", new StandardSQLFunction("group_concat", StandardBasicTypes.STRING));
                }
            }
    
            //Dao Method
    
            public List<Client> getTest() {
                    Query query = getSession()
                            .createQuery("SELECT sl.name as name ,group_concat(sl.domain) as domain FROM SlClient sl GROUP BY sl.name");
                    query.setResultTransformer(Transformers.aliasToBean(Client.class));
                    return query.list();
                }
    //DTO Class
        public class Client {
            private String name;
            private String domain;
        //Getter 
        //Setter
        }
    
  4. from https://stackoverflow.com/questions/12346845/registering-a-sql-function-with-jpa-and-hibernate by cc-by-sa and MIT license