Как вызвать функцию оракула из весеннего загрузочного приложения?

Мое требование: мне нужно вызвать функцию оракула из весеннего загрузочного приложения без использования NATIVE запроса.

ниже моя функция оракула, которая принимает дату в качестве входных данных

create or replace FUNCTION todate(src_dt IN date) 
 RETURN date
 is
  BEGIN 
  RETURN(to_date(src_dt)); 
  END;

Я искал решение в Интернете, но пока не нашел. люди говорят, что нужно создать какой-то пользовательский диалект, но не нашли идеальной пошаговой ссылки.

ниже мой код Java: -

 Query query1 = entityManager.createQuery("select todate(ActSubT.createdDt) from ActSubT ActSubT");
    List<Object> result=query1.getResultList();

этот код должен работать, на данный момент он выдает ошибку, поскольку todate является функцией оракула, и я ничего не настроил в файле application.yml.

ниже ошибка, которую я получаю

  java.lang.IllegalArgumentException: org.hibernate.QueryException: 
  No data type for node: 
 org.hibernate.hql.internal.ast.tree.MethodNode 
 \-[METHOD_CALL] MethodNode: '('
  +-[METHOD_NAME] IdentNode: 'todate' {originalText=todate}

Пожалуйста помоги


person Harish Bagora    schedule 16.08.2019    source источник
comment
Проверьте stackoverflow.com/questions/41837546/   -  person parthivrshah    schedule 16.08.2019
comment
@parthivrshah я ответил на этот ответ ранее, но мое требование - без использования NATIVE запроса, мне нужно вызвать функцию БД   -  person Harish Bagora    schedule 16.08.2019
comment
Я не думаю, что вы можете вызывать функцию БД без собственного запроса   -  person parthivrshah    schedule 16.08.2019
comment
@parthivrshah, вы можете проверить эту ссылку thoughts-on-java.org/database-functions у нас есть вариант, но я не могу настроить запись пользовательского диалекта в нашем файле yml   -  person Harish Bagora    schedule 16.08.2019
comment
Я никогда этого не пробовал.   -  person parthivrshah    schedule 16.08.2019
comment
На странице, на которую ссылаются, говорится, что если мы хотим использовать функцию в проекции запроса - как в вашем примере - нам нужно Зарегистрировать функцию на диалекте Hibernate. Вы сделали это?   -  person APC    schedule 16.08.2019
comment
@APC да, теперь я могу решить свою проблему, я отправил правильный ответ .. спасибо :)   -  person Harish Bagora    schedule 16.08.2019


Ответы (1)


Я могу решить свою проблему.

шаг 1: - я создал собственный диалект, ниже мой код..

public class CustomDialect extends Oracle12cDialect {
    public CustomDialect() {
        super();
        // CustomFunction implements SqlFunction
      //  registerFunction("custom_function", new CustomFunction());
        // or use StandardSQLFunction; useful for coalesce
        registerFunction("todate", new StandardSQLFunction("todate", StandardBasicTypes.DATE));
    }
}

Шаг 2: теперь я вызываю функцию todate, ниже приведен код Java.

Query query1 = entityManager.createQuery("select function('todate',ActSubT.createdDt) from ActSubT ActSubT where ActSubT.id=1105619");

        Object resulth=query1.getSingleResult();

Шаг 3: - эту запись нам нужно поместить в application.poperties/application.yml

# Allows Hibernate to generate SQL optimized for a particular DBMS
spring.jpa.properties.hibernate.dialect = com.sbill.app.config.CustomDialect

Вот и все, теперь я могу вызывать функцию БД с помощью java-кода.

person Harish Bagora    schedule 16.08.2019