JPA 存储过程抛出异常:无法提取结果集

JPA Stored Procedure throwing exception: could not extract ResultSet

我正在尝试从 azure sql 调用一个基本存储过程,它只返回数字 1,看起来像这样

CREATE PROCEDURE [dbo].[testProc]
@TableName varchar(100)
AS
BEGIN 
SET NOCOUNT ON
SELECT 1
END

我有一个 spring 启动应用程序尝试使用 @Query 注释调用存储过程

@Repository
@Transactional
public interface TestDAO extends JpaRepository<TestEntity, Long> {

     @Query(value = "CALL testProc(:TableName)", nativeQuery = true)
     Long invokeTestProc(@Param("TableName") String TableName);

}

但是,我得到一个异常,它说 “'@P0' 附近的语法不正确” 和 SQLGrammarException:无法提取结果集。

我不确定如何解决这个问题,我尝试将 @Procedure 与 @NamedStoredProcedureQueries 注释一起使用,它引发了另一个异常,提示“不能将位置参数与命名参数注册混合;”

根据 Azure Sql 的 documentation,您必须使用以下内容调用存储过程

EXECUTE HumanResources.uspGetEmployeesTest2 N'Ackerman', N'Pilar';
-- Or
EXEC HumanResources.uspGetEmployeesTest2 @LastName = N'Ackerman', @FirstName = N'Pilar';

因此在您的情况下,这将被翻译为

 @Query(value = "EXECUTE testProc :TableName", nativeQuery = true)
 Long invokeTestProc(@Param("TableName") String TableName);

 @Query(value = "EXEC testProc @TableName = :TableName", nativeQuery = true)
 Long invokeTestProc(@Param("TableName") String TableName);

因此考虑到您使用本机查询,

exception which says "Incorrect syntax near '@P0'" and SQLGrammarException: could not extract ResultSet.

指的是 sql 语法的错误使用,您不使用 execute 或 exec 并且还以 Azure SQL 所不期望的方式传递参数。