【发布时间】:2018-10-19 03:42:59
【问题描述】:
我正在尝试使用 JPA(和 Spring Boot 2)来执行 SQL Server 存储过程。流程如下:
CREATE Procedure [dbo].[GetStatus]
@statusId char(32),
@bar int
AS
BEGIN TRY
SELECT IIF(COUNT(1)>0 , 1, 0) FROM Status WITH (NOLOCK)
WHERE statusId = @statusId AND bar = @bar
END TRY
BEGIN CATCH
EXEC EventLog @@PROCID
END CATCH
GO
我正在尝试捕获返回值,但找不到这样做的方法。我的实体是:
@Entity
@Table(name = "status")
@NamedStoredProcedureQueries({
@NamedStoredProcedureQuery(name = "getStatusByStatusId",
procedureName = "GetStatus",
parameters = {
@StoredProcedureParameter(mode = ParameterMode.IN, name = "statusId", type = String.class),
@StoredProcedureParameter(mode = ParameterMode.IN, name = "bar", type = Integer.class) })
})
public class Status implements Serializable {
@Id
@GeneratedValue
private Long id;
private Integer bar;
private String statusId;
private Date createDate;
}
我的存储库是:
@Repository
public interface StatusRepository extends JpaRepository<Status, Long> {
@Procedure("GetStatus")
int getStatusByStatusId(@Param("statusId") String statusId, @Param("bar") Integer bar);
}
当我从服务层运行这个方法时,我得到一个错误:
"没有为存储过程定义参数输出..."
我尝试添加参数(通过将其命名为计数和类型为整数)。我尝试了 List, Object[] 但没有任何效果。 唯一有效的是,如果我将存储库方法更改为返回 void。但在那种情况下,我无法获得返回值。 所以,我的问题是如何获得 SELECT 值?任何帮助表示赞赏。我的 app.yml 有:
datasource:
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
url: jdbc:sqlserver://dev.lsd.com:1433;databaseName=Qrex;integratedSecurity=true;MultiSubnetFailover=true;authenticationScheme=JavaKerberos
username:
password:
jpa:
hibernate:
ddl-auto: none
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
show-sql: true
database-platform: org.hibernate.dialect.SQLServerDialect
database: sql_server
我的 gradle 依赖是:
compile "com.microsoft.sqlserver:mssql-jdbc:6.4.0.jre8"
【问题讨论】:
标签: sql-server spring-boot stored-procedures spring-data-jpa