Java 使用createNativeQuery调用Oracle存储过程

Java 使用createNativeQuery调用Oracle存储过程,java,oracle,stored-procedures,jpa,Java,Oracle,Stored Procedures,Jpa,我需要使用JPA调用一个存储过程,并发现本文: 这说明了如何使用EntityManager.createNativeQuery。但是,该示例实际上调用了一个具有返回参数的函数。我尝试搜索一个调用一个没有返回的存储过程的示例,但是没有找到任何内容 我可以使用createNativeQuery调用过程吗?或者该过程是否需要修改为可能返回成功/失败结果的函数 谢谢 来自JPA维基: JPA不直接支持存储过程。某些类型的存储过程可以通过使用本机查询在JPA中执行。JPA中的本机查询允许任何不返回任何内容

我需要使用JPA调用一个存储过程,并发现本文:

这说明了如何使用EntityManager.createNativeQuery。但是,该示例实际上调用了一个具有返回参数的函数。我尝试搜索一个调用一个没有返回的存储过程的示例,但是没有找到任何内容

我可以使用createNativeQuery调用过程吗?或者该过程是否需要修改为可能返回成功/失败结果的函数

谢谢

来自JPA维基:

JPA不直接支持存储过程。某些类型的存储过程可以通过使用本机查询在JPA中执行。JPA中的本机查询允许任何不返回任何内容或返回要执行的数据库结果集的SQL。执行存储过程的语法取决于数据库。JPA不支持使用OUTPUT或INOUT参数的存储过程。有些数据库(如DB2、Sybase和SQL Server)允许存储过程返回结果集。Oracle不允许返回结果集,只允许返回输出参数,但定义了可以作为输出参数返回的游标类型。Oracle还支持可以返回单个值的存储函数。通过从Oracle双表中选择函数值,通常可以使用本机SQL查询执行存储函数

有些JPA提供程序扩展了对存储过程的支持,有些还支持用存储过程或自定义SQL重写实体的任何CRUD操作。一些JPA提供程序支持游标输出参数

在Oracle上执行存储过程的示例 因此,我的建议是:

做一些实验,即尝试一下 如果需要,并在可能的情况下修改存储过程 考虑特定供应商的扩展作为最后的手段
如果可能,您可能需要以以下方式包装过程调用:

em.createNativeQuery("BEGIN yourprocedure; END;")

获取返回值可能与过程有关。传递它们应该很容易。

如前所述,JPA规范还不支持StoredProcess,但EclipseLink JPA提供程序支持:


谢谢帕斯卡的链接。我不知道我怎么会在搜索中漏掉那一页。
em.createNativeQuery("BEGIN yourprocedure; END;")