gpt4 book ai didi

java - Spring Data JPA 调用 Oracle 函数

转载 作者:行者123 更新时间:2023-12-01 23:24:48 26 4
gpt4 key购买 nike

我正在运行一个简单的应用程序,它使用 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;

在没有框架的情况下执行此操作会很简单,但该项目内置于 Spring Boot JPA 中,因此最好使用它。

我需要一个引用指南链接或简单的基本结构来遵循。我搜索了整个 SO 和 Spring Data JPA 引用,我发现的所有示例都是针对 CRUD 和存储过程的,没有针对函数的。

我尝试使用针对函数进行修改的存储过程示例,但没有成功。

最佳答案

您可以通过 native 查询调用您的函数并从 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);

}

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

您还可以实现您的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));
}

}

关于java - Spring Data JPA 调用 Oracle 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45867348/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com