首页 > 解决方案 > 使用 jpa 2.x 调用存储过程会引发非法ArgumentException

问题描述

我的 mssql 服务器上有以下过程,我想从我的 java 代码中执行

DECLARE @RC int
DECLARE @newUid bigint

EXECUTE @RC = [TEST_DB].[foobar].[getNextUid] @newUid OUTPUT

在我的代码中,我定义了一个实体并使用 NamedStoredProcedureQuery 注释来定义它

@Entity
@NamedStoredProcedureQuery(
    name = "foobar.getNextUid",
    procedureName = "foobar.getNextUid",
    parameters = {
        @StoredProcedureParameter(mode = ParameterMode.OUT, type = Long.class, name = "newUid")
    }
)

当我在测试中调用此存储过程时,它会引发异常

java.lang.IllegalArgumentException: No @NamedStoredProcedureQuery was found with that name : foobar.getNextUid

我还尝试将注释中的参数命名为@newUid

这是我的测试用例

EntityManager entityManager = managerEntityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
StoredProcedureQuery query = entityManager.createNamedStoredProcedureQuery("foobar.getNextUid");
query.setParameter("@newUid", 1);
long nextUid = (long) query.getOutputParameterValue("newUid");

entityManager.getTransaction().commit();
entityManager.close();

标签: javajpaspring-data-jpa

解决方案


尝试替换 query.getOutputParameterValue("@newUid"); 通过 query.getOutputParameterValue("newUid");


推荐阅读