1

我的要求是我需要在不使用 NATIVE 查询的情况下从 Spring Boot 应用程序调用 oracle 函数。

下面是我的 oracle 函数,它以 Date 作为输入

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 是 oracle 函数,我没有在 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}

请帮忙

4

1 回答 1

3

我能够解决我的问题。

第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代码调用db函数了。

于 2019-08-16T14:00:10.103 回答