我正在运行一个使用Spring Boot + Spring Data JPA进行持久化的简单应用程序。
下面是一个示例Oracle函数我希望在Service实现类中返回值。
this.payload.email = 'example@email.com';
没有框架这样做很简单,但是项目内置于Spring Boot JPA中,因此最好使用它。
我需要一个参考指南链接或简单的基础结构。 我搜索了所有的SO和Spring Data JPA参考,我找到的所有例子都是针对CRUD和存储过程的,没有任何函数。
我尝试使用为功能修改的存储过程示例但不起作用。
答案 0 :(得分:3)
您可以通过原生查询调用您的函数,并从双重结果中获取结果。
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语句,它将无法工作。在这种情况下,您需要对查询使用@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));
}
}
答案 1 :(得分:0)
使用entityManager.createNativeQuery工作。
请参阅:How to call a custom Oracle function returning a value from JPA
和引用的网页:https://vladmihalcea.com/how-to-call-oracle-stored-procedures-and-functions-from-hibernate/
答案 2 :(得分:0)
如果您使用Hibernate作为JPA Provider,您可以创建自定义方言并注册所需的功能。
public class CustomDialect extends Oracle10gDialect {
public CustomDialect() {
super();
// CustomFunction implements SqlFunction
registerFunction("custom_function", new CustomFunction());
// or use StandardSQLFunction; useful for coalesce
registerFunction("coalesce", new StandardSQLFunction("coalesce"));
}
}
答案 3 :(得分:0)
public interface inteface-name extends CrudRepository<Object,Long> {
@Procedure(procedureName = "procedure-name", outputParameterName = "param-out-name")
BigDecimal method-name(dataType input-param);
}
答案 4 :(得分:0)
如果您需要从函数返回作为oracle类型返回的n行数为n的列集,请对select语句使用 Table(function_name)将类型解析为表,然后作为对象数组列表的列表获取。
@Query(nativeQuery = true, value = "SELECT * FROM TABLE(ListOfStates(:country))")
List<Object[]> findStatesByCountry(@Param("country") String country);
答案 5 :(得分:0)
this.entityManager.getSession().doWork(connection -> {
try (CallableStatement query = connection
.prepareCall("BEGIN ? := FUNCTION_NAME(?); END;")) {
query.registerOutParameter("PARAM1", Types.VARCHAR); // out param
query.setString("PARAM2"), "SOME_VALUE"); // in param
query.execute();
String value = query.getString("PARAM1"); //outparam result
System.out.println(value);
} catch (Exception ex) {
//process exception here
}
});