Java 错误:未为存储过程定义参数out

Java 错误:未为存储过程定义参数out,java,hibernate,jpa,jdbc,spring-data-jpa,Java,Hibernate,Jpa,Jdbc,Spring Data Jpa,调用此存储过程时: procedure [dbo].[pTest] @Date varchar(max) =null as begin select * from test end 来自java,使用Spring数据JPA1.10.2和com.microsoft.sqlserver的SQLJDBC4.2。我没有错。但当我向过程中添加另一个参数时 procedure [dbo].[pTest] @ReportData varbinary(max) out ,@Dat

调用此存储过程时:

procedure [dbo].[pTest]
     @Date varchar(max) =null
as
begin
select * from test
end
来自java,使用Spring数据JPA1.10.2和com.microsoft.sqlserver的SQLJDBC4.2。我没有错。但当我向过程中添加另一个参数时

procedure [dbo].[pTest]
     @ReportData varbinary(max) out
     ,@Date varchar(max) =null
as
begin
select * from test
end
我得到以下错误:

2016-10-06 15:50:16.283 DEBUG 32604 --- [           main] c.m.s.jdbc.internals.SQLServerException  : *** SQLException:SQLServerCallableStatement:9 com.microsoft.sqlserver.jdbc.SQLServerException: Parameter out was not defined for stored procedure pTest. Parameter out was not defined for stored procedure pTest.
2016-10-06 15:50:16.289 DEBUG 32604 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : Error preparing CallableStatement [pTest]

com.microsoft.sqlserver.jdbc.SQLServerException: Parameter out was not defined for stored procedure pTest.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:191) ~[sqljdbc-4.2.jar:na]
如果删除
@Date
参数并相应地修改代码,则不会出现错误。一旦我将
@Date
参数添加回两个参数,我再次得到错误。为什么?

两个参数的代码如下:

@Entity
@NamedStoredProcedureQuery(name = "Test.getTest", procedureName = "pTest", parameters = {
        @StoredProcedureParameter(mode = ParameterMode.IN, name = "Date", type = String.class),
        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "ReportData", type = byte[].class)
          })
public class Test {

    // serves no purpose other than to meet
    // JPA requirement
    @Id
    private byte[] reportData;
}
Spring数据存储库:

public interface TestRepository  extends Repository<Test, Long> {
    @Procedure("pTest")
    byte[] get(@Param("Date") String date);
}
发现问题:)需要将
@namedStoredProcedureRequesty
的属性名称与存储库方法名称匹配。因此,改变这一点:

@Entity
@NamedStoredProcedureQuery(name = "Test.getTest", procedureName = "pTest", parameters = {
        @StoredProcedureParameter(mode = ParameterMode.IN, name = "Date", type = String.class),
        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "ReportData", type = byte[].class)
          })
为此:

@Entity
@NamedStoredProcedureQuery(name = "Test.get", procedureName = "pTest", parameters = {
        @StoredProcedureParameter(mode = ParameterMode.IN, name = "Date", type = String.class),
        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "ReportData", type = byte[].class)
          })

如果我使用jTDS,我会得到错误
过程或函数'pTest'需要参数'@ReportData',该参数未提供。
我使用的是SQL Server 2005,但它似乎与SQL Server 2008具有相同的行为。参数的顺序可以是导入,您是否尝试过切换参数的顺序,以便在
@namedStoredProcedureRequesty
定义中首先声明
OUT
,或在存储过程DDL中声明
OUT
第二个?我更改了顺序,使
OUT
@namedStoredProcedureRequesty
中处于第一位。但我仍然收到相同的错误。我确实找到了解决这个问题的办法。我会发布它,但如果能理解OP中的代码为什么不起作用,那就太好了。找到了正确的解决方案。。。我想:)
@Entity
@NamedStoredProcedureQuery(name = "Test.get", procedureName = "pTest", parameters = {
        @StoredProcedureParameter(mode = ParameterMode.IN, name = "Date", type = String.class),
        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "ReportData", type = byte[].class)
          })