我试图通过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调用它,它可以正常工作。为什么呢?
感谢您的支持。
的问候。 莫罗
答案 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();
希望有所帮助:)