使用Repository调用存储过程

时间:2014-10-24 16:06:26

标签: spring jpa stored-procedures

我试图通过CrudRepository方法(spring-jpa)调用数据库存储过程。

这是我的存储库的代码

public interface TestRepo extends JpaRepository<NewsContainer, Long> {

@Procedure(procedureName = "ncMaxVisualisations")
public Long getMaxNumberOfVisualisations(); 
}

这是课堂测试的代码

public class RankingTest {

 private Logger logger = Logger.getLogger(RankingTest.class);

 @Autowired
 TestRepo repo;

 @Autowired
 EntityManager em;

 @Test
 public void testWithEM(){
    StoredProcedureQuery store = em.createStoredProcedureQuery("ncMaxVisualisations");
    int visualisations = (int) store.getSingleResult();
    System.out.println(visualisations);
 }


 @Test
 public void testWithRepository(){
    System.out.println(repo.getMaxNumberOfVisualisations());
 }  
}

测试的输出是

testWithRepository() 
Hibernate: {call ncMaxVisualisations(?)}
  2014-10-24 17:47:28 WARN  SqlExceptionHelper:144 - SQL Error: 0, SQLState: S1009
  2014-10-24 17:47:28 ERROR SqlExceptionHelper:146 - Parameter number 1 is not an OUT    parameter
testWithEM()
Hibernate: {call ncMaxVisualisations()}
  50

如果我用存储库调用存储过程,它会等待参数,而如果我使用EntityManager调用它,它可以正常工作。为什么呢?

感谢您的支持。

的问候。 莫罗

1 个答案:

答案 0 :(得分:2)

AFAIK,Spring期望一个OUT类型的参数,它会读取你的输出值。

我做了一个测试:

步骤:

create or replace PROCEDURE TESTPROCEDURE 
(
  TEST1 OUT NUMBER
) AS 
BEGIN
  TEST1 := 50;

END TESTPROCEDURE;

映射:

@Procedure(procedureName = "TESTPROCEDURE", outputParameterName = "TEST1")
public Long callTestProcedure(); 

希望有所帮助:)