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)
})