如何调用从JPA返回值的自定义Oracle函数

我在oracle中有一个自定义函数,在删除记录后返回一个数字。 我可以在sql_plus中获取一个值,例如

call my_function(4) into :out_number; 

其中out_number是一个定义为数字的变量。

当我执行“PRINT OUT_NUMBER”时,我可以validationout_number是否有值。

我的问题是如何从JPA调用此函数。

我试过了

 Query query = em.createNativeQuery("{call my_function(?)}"); query.serParameter(1, 4); return query.executeUpdate(); 

并且基本上没有定义my_function得到错误。 如何在CALL … INTO SQL_PLUS上获得返回值?

如果这种方法不可取,有人可以推荐一下吗? JPA是目前我唯一的选择。 我可以创建一个存储过程,但我不确定是否可以从中获取返回值,因为不支持OUT参数。

感谢您的帮助!

我用它在oracle中执行本机函数:

 Query query = em.createNativeQuery("select my_function(:param) from dual"); query.setParameter("param", 4); return query.getSingleResult(); 

这是一个相当古老的问题,但我没有在这里找到正确的解决方案……这是一个适用于我的项目的代码:

  EntityManager em; String functionName = "NameOfStoredFunction"; Map arguments = new LinkedHashMap(); arguments.put("nameOfArgument", "value"); StoredFunctionCall functionCall = new StoredFunctionCall(); functionCall.setProcedureName(functionName); functionCall.setResult("RESULT", String.class); for(String key : arguments.keySet()){ functionCall.addNamedArgumentValue(key, arguments.get(key)); } ValueReadQuery valQuery = new ValueReadQuery(); valQuery.setCall(functionCall); Query query = ((JpaEntityManager)em.getDelegate()).createQuery(valQuery); String call_result = (String)query.getSingleResult(); 

来自https://vladmihalcea.com/how-to-call-oracle-stored-procedures-and-functions-from-hibernate/ :

首先,我们可以像调用任何其他SQL查询一样简单地调用Oracle函数:

 BigDecimal commentCount = (BigDecimal) entityManager .createNativeQuery( "SELECT fn_count_comments(:postId) FROM DUAL" ) .setParameter("postId", 1L) .getSingleResult(); 

另一种方法是使用普通JDBC API调用数据库函数:

 Session session = entityManager.unwrap( Session.class ); final AtomicReference commentCount = new AtomicReference<>(); session.doWork( connection -> { try (CallableStatement function = connection .prepareCall( "{ ? = call fn_count_comments(?) }" ) ) { function.registerOutParameter( 1, Types.INTEGER ); function.setInt( 2, 1 ); function.execute(); commentCount.set( function.getInt( 1 ) ); } } ); 

如果您正在使用EclipseLink,则可以使用StoredFunctionCall对象来调用存储的函数,例如this。

您还可以使用@NamedStoredFunctionQuery将其定义为命名查询。