使用JPA @Query()调用存储过程

时间:2018-08-03 19:32:03

标签: java spring-data-jpa

是否可以使用JPA @Query()如下所示执行SQL Server存储过程

@Query(nativeQuery = true, value = "exec [dbo].[uspGetVinorUserInfo] =:vin")
List<Object> findCommandStatusByVinOrderByCreatedTimestampDesc(@Param("vin") String vin);

2 个答案:

答案 0 :(得分:0)

自JPA 2.1版本开始,请参阅NamedStoredProcedureQuery注释。但是在我看来,您使用了某些特定的JPA实现或某些框架(可能是Spring Data JPA?),因为@Query注释不是JPA specification的一部分;因此,我很难为您的案例提供具体的代码段。

答案 1 :(得分:0)

我找不到使用@Query执行MS-SQL SP的方法,但是我使用下面的代码执行了MS-SQL存储过程,并且运行良好。

package com.ford.cevs.scheduler.repository;
import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import javax.persistence.ParameterMode;
import javax.persistence.PersistenceContext;
import javax.persistence.StoredProcedureQuery;

@Repository
public class CommandStatusRepositoryImpl implements CommandStatusRepository {

@PersistenceContext
protected EntityManager em;

@Override
public String executeCommandStatusPurge(Integer minutes) {

        StoredProcedureQuery storedProcedure = em.createStoredProcedureQuery("MyProcedureName");

        // set parameters
        storedProcedure.registerStoredProcedureParameter("minutes", Integer.class, ParameterMode.IN);
        storedProcedure.setParameter("minutes", minutes);
        storedProcedure.execute();

        String result = (String)storedProcedure.getSingleResult();

        return result;
}
}  

MS-SQL存储过程

ALTER PROCEDURE [dbo].[MyProcedureName] @minutes int 
AS 
   SET nocount ON

    DECLARE @Message VARCHAR(40); 

      SET @Message = ' Completed, ' 

      -- <Your code> --- @minutes 

        SELECT @Message

以下链接显示了不同的方式: https://www.programcreek.com/java-api-examples/index.php?api=javax.persistence.StoredProcedureQuery