当前位置: 首页 > 知识库问答 >
问题:

Spring Boot Data JPA从存储过程接收多个Out参数

蓟和煦
2023-03-14

我试图通过Spring Boot Data JPA(V2.2.6)调用具有多个out参数的存储过程,但收到一个错误:

DEBUG [http-nio-8080-exec-1] org.hibernate.engine.jdbc.spi.SqlStatementLogger: {call TEST_SP(?,?,?)}
RACE [http-nio-8080-exec-1] org.hibernate.type.descriptor.sql.BasicBinder: binding parameter [DOC_NAME] as [VARCHAR] - [ololo]
ERROR [http-nio-8080-exec-1] org.apache.juli.logging.DirectJDKLog: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: OUT/INOUT parameter not available: DOC_ID; nested exception is java.lang.IllegalArgumentException: OUT/INOUT parameter not available: DOC_ID] with root cause
java.lang.IllegalArgumentException: OUT/INOUT parameter not available: DOC_ID
CREATE PROCEDURE [dbo].[TEST_SP]
    @DOC_ID bigint output,
    @DOC_GUID nvarchar(255) output,
    @DOC_NAME nvarchar(255)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT @DOC_ID = 6666, @DOC_GUID = @DOC_NAME
END
@Data
@Entity
@NamedStoredProcedureQuery(name = "SomeEntity.test", procedureName = "TEST_SP", parameters = {
        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "DOC_ID", type = Long.class),
        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "DOC_GUID", type = String.class),
        @StoredProcedureParameter(mode = ParameterMode.IN, name = "DOC_NAME", type = String.class)
})
@Table(name = "DOCUMENT_DATA")
public class SomeEntity {
    // some variables
}
public interface SomeRepository extends JpaRepository<SomeEntity, Long> {

    @Procedure(name = "SomeEntity.test")
    Map<String, Object> testSp(@Param("DOC_NAME") String docName);
}
@RestController
public class Controller {

    @Autowired
    SomeRepository repository;

    @GetMapping("test")
    String test() {
        return repository.testSp("ololo").toString();
    }
}

作为示例,我使用了以下链接:https://github.com/spring-projects/spring-data-jpa/blob/master/src/test/java/org/springframework/data/jpa/doma/doma/sample/userrepository.java#l77 https://github.com/spring-projects/spring-data-jpa-jpa/doma/doma/sample/sample/userrepository.java#l77

UPD:我试过Oracle11g

CREATE OR REPLACE PROCEDURE test_sp(x OUT INTEGER, y OUT INTEGER) AS
BEGIN
  x := 17; y := 93;
END;


@NamedStoredProcedureQuery(name = "EstatementsDataEntity.test", procedureName = "test_sp", parameters = {
        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "x", type = Integer.class),
        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "y", type = Integer.class)
})

但收到几乎相同的错误:

java.lang.IllegalArgumentException: OUT/INOUT parameter not available: 1

共有1个答案

段坚
2023-03-14

我找不到带有注释的工作解决方案,并提交了一个bug DATAJPA-1722

但是我可以使用EntityManager解决这个问题:

@SpringBootTest
class DemoApplicationTests {

    @PersistenceContext
    private EntityManager em;

    @Test
    void callStoredProcedureUsingEntitiManager() {
        StoredProcedureQuery proc = em.createStoredProcedureQuery("test_sp");
        proc.registerStoredProcedureParameter("x", Integer.class, ParameterMode.OUT);
        proc.registerStoredProcedureParameter("y", Integer.class, ParameterMode.OUT);
        proc.execute();
        assertThat(proc.getOutputParameterValue("x")).isEqualTo(17);
        assertThat(proc.getOutputParameterValue("y")).isEqualTo(93);
    }

}
 类似资料:
  • 我通过Hibernate调用了一个带有OUT参数的存储过程,得到了以下错误: 我的存储过程: Hibernate映射: 我按如下方式调用了存储过程: 有人能解释一下这段代码有什么问题吗?

  • 本文向大家介绍Sql Server 存储过程调用存储过程接收输出参数返回值,包括了Sql Server 存储过程调用存储过程接收输出参数返回值的使用技巧和注意事项,需要的朋友参考一下 创建存储过程: 接收输出参数: 2,带返回值 创建存储过程: 接收返回值: 以上所述是小编给大家介绍的Sql Server 存储过程调用存储过程接收输出参数返回值,希望对大家有所帮助,如果大家有任何疑问请给我留言,小

  • 问题是,我想用mybatis/ibatis从java调用一个存储过程,这个过程有多个OUT参数,精确的7个,其中2个是Number,另外5个varchar,加上一个Number param 在上下文中有一个很大的限制,它没有模型,只有映射和列表,尽管如果需要,我们可以在调用过程时做一个例外。此外,解决方案必须用java完成,没有使用xml。 我有一个springboot应用程序,有一个rest服务

  • 问题内容: 我已经使用PDO一段时间了,并且正在重构一个项目,以便它使用存储的proc而不是内联SQL。我收到一个我无法解释的错误。我正在使用PHP版本5.3.5和MySQL版本5.0.7。 我只是想获得一个带有输出的基本存储过程。这是存储的过程: 这是我用来调用proc的代码,$ db是PDO的一个实例: 简单吧?但是,它导致以下错误: 如果我直接这样调用proc: 它按预期工作,这使我相信PH

  • 问题内容: 我想创建一个存储过程,该存储过程接受IN参数中的所有值作为单个字符串。 这是我尝试过的一个示例,但是没有用。 我收到以下错误: 运行此查询时: 问题答案: 您需要将VARCHAR大小更改为最大值(或较低的有效值)。 但是,请注意,如果使用多字节字符集,则限制会更低:

  • 问题内容: 我有一个需要很多参数的插入存储过程-其中2个是@ FirstName,@ LastName。我还有一个更新存储过程,该过程需要许多参数-其中2个是@ FirstName,@ LastName。 我想做的是,从插入SP内部完成之后,调用更新SP并将其发送给@ FirstName,@ LastName。 我不知道这样做的正确语法;我试过了: 但我认为这是错误的。 有人可以告诉我怎么写这个电

  • 问题内容: 我有一个应用程序,每小时执行约20000次DATA-OPERATIONS DATA- OPERATION总共具有30个参数(用于所有10个查询)。有些是文本,有些是数字。某些Text参数最长为10000个字符。 每个DATA-OPERATION都执行以下操作: 单个DATA-OPERATION,可在数据库中插入/更新多个表(约10个)。 对于每一次DATA-OPERATION,我都会建

  • 问题内容: 我正在使用Sql Server2008。我的存储过程接受将近150个参数。在性能方面有什么问题吗? 问题答案: 在性能上没有错,但是闻起来可以用动态SQL更好地完成。不看代码很难说。