Spring Data JPA 调用 Oracle 函数

Bru*_*lça 7 java oracle spring jpa function

我正在运行一个简单的应用程序,它使用 Spring Boot + Spring Data JPA 进行持久化。

下面是一个示例 Oracle 函数,我希望在服务实现类中返回值。

CREATE OR REPLACE PACKAGE PKG_TEST AS 
  FUNCTION HELLO_WORLD(TEXT VARCHAR2) RETURN VARCHAR2;
END PKG_TEST;

CREATE OR REPLACE PACKAGE BODY PKG_TEST AS 
  FUNCTION HELLO_WORLD(TEXT VARCHAR2) RETURN VARCHAR2 IS
  BEGIN
    RETURN 'HELLO WORLD ' || TEXT;
  END;
END PKG_TEST;
Run Code Online (Sandbox Code Playgroud)

在没有框架的情况下这样做会很简单,但是该项目内置在 Spring Boot JPA 中,因此最好使用它。

我需要一个参考指南链接或简单的基础结构来遵循。我搜索了所有 SO 和 Spring Data JPA 参考,我找到的所有示例都针对 CRUD 和存储过程,而没有针对函数。

我尝试使用为功能修改的存储过程示例,但没有奏效。

Mic*_*mal 9

您可以通过本机查询调用您的函数并从 Dual 中获取结果。

public interface HelloWorldRepository extends JpaRepository<HelloWorld, Long> {

    @Query(nativeQuery = true, value = "SELECT PKG_TEST.HELLO_WORLD(:text) FROM dual")
    String callHelloWorld(@Param("text") String text);

}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您的函数使用 DML 语句,它将不起作用。在这种情况下,您需要@Modyfing在查询上使用注释,但由于@Modyfing返回类型限制,函数本身必须返回数字。

您还可以实现您的CustomRepository和使用SimpleJdbcCall

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.stereotype.Repository;

@Repository
public class HelloWorldRepositoryImpl implements HelloWorldRepositoryCustom {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public String callHelloWorld() {
        SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
                .withCatalogName("PKG_TEST") //package name
                .withFunctionName("HELLO_WORLD");
        SqlParameterSource paramMap = new MapSqlParameterSource()
                .addValue("param", "value"));
        //First parameter is function output parameter type.
        return jdbcCall.executeFunction(String.class, paramMap));
    }

}
Run Code Online (Sandbox Code Playgroud)