我正在尝试调用存储过程,其签名如下所示:
CREATE OR REPLACE PROCEDURE FIND_FIRST_BOOKMARK_GT(bookmark IN NUMBER, cur OUT SYS_REFCURSOR)
我正在使用Spring-Data JPA并尝试了许多不同的变体,但它们都或多或少地遵循以下模式。我的实体模型装饰如下:
@NamedStoredProcedureQuery(name = "Response.findFirstBookmarkGreaterThan", procedureName = "FIND_FIRST_BOOKMARK_GT",
resultClasses = Response.class,
parameters = {
@StoredProcedureParameter(name = "bookmark", mode = ParameterMode.IN, type = Long.class),
@StoredProcedureParameter(name = "cur", mode = ParameterMode.REF_CURSOR, type = void.class)
})
})
然后我的存储库看起来如下:
@Repository
public interface ResponseRepository extends CrudRepository<Response, Long>{
@Procedure("Response.findFirstBookmarkGreaterThan")
Response findFirstBookmarkGreaterThan(@Param("bookmark") Long bookmark);
}
我已经按照了很多例子的说明,但我总是留下同样的错误,即:
java.lang.IllegalArgumentException: Type cannot be null
at org.hibernate.procedure.internal.AbstractParameterRegistrationImpl.setHibernateType(AbstractParameterRegistrationImpl.java:182) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.procedure.internal.AbstractParameterRegistrationImpl.<init>(AbstractParameterRegistrationImpl.java:131) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.procedure.internal.AbstractParameterRegistrationImpl.<init>(AbstractParameterRegistrationImpl.java:140) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.procedure.internal.AbstractParameterRegistrationImpl.<init>(AbstractParameterRegistrationImpl.java:97) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.procedure.internal.NamedParameterRegistration.<init>(NamedParameterRegistration.java:41) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.procedure.internal.ProcedureCallImpl.registerParameter(ProcedureCallImpl.java:344) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.jpa.internal.StoredProcedureQueryImpl.registerStoredProcedureParameter(StoredProcedureQueryImpl.java:152) ~[hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final]
at org.springframework.data.jpa.repository.query.StoredProcedureJpaQuery.newAdhocStoredProcedureQuery(StoredProcedureJpaQuery.java:175) ~[spring-data-jpa-1.9.4.RELEASE.jar:na]
at org.springframework.data.jpa.repository.query.StoredProcedureJpaQuery.createStoredProcedure(StoredProcedureJpaQuery.java:130) ~[spring-data-jpa-1.9.4.RELEASE.jar:na]
at org.springframework.data.jpa.repository.query.StoredProcedureJpaQuery.doCreateQuery(StoredProcedureJpaQuery.java:89) ~[spring-data-jpa-1.9.4.RELEASE.jar:na]
at org.springframework.data.jpa.repository.query.StoredProcedureJpaQuery.createQuery(StoredProcedureJpaQuery.java:80) ~[spring-data-jpa-1.9.4.RELEASE.jar:na]
......
这里有什么问题吗?
答案 0 :(得分:0)
我无法使这种语法正常工作,但是,从存储过程中检索的概念实际上是从应用基于输入的函数混合的(可能是视图)中进行选择的简写。为此,我用一个产生相同效果的函数/表替换了我的存储过程。
Person
这将@Query("SELECT r FROM RESPONSES r WHERE BOOKMARK = FIND_FIRST_BOOKMARK_GT(:bookmark)")
Response findFirstBookmarkGreaterThan(@Param("bookmark") Long bookmark);
语法与表和函数结合使用,其整体逻辑与调用我预期的存储过程相同。虽然可能更难以遵循,但语法至少比使用@Query
更短。
该函数对存储过程最初对@NamedStoredProcedureQuery
的最后一部分执行的操作执行相同的操作,现在将其封装为SELECT INTO
的一部分。
答案 1 :(得分:0)
使用@Procedure
面临同样的问题。作为一种变通方法,您可以在服务类中引用entityManager并从中调用过程。
@Service
public interface ResponseService {
@PersistenceContext
EntityManager entityManager;
public Response findFirstBookmarkGreaterThan(Long bookmark){
Query query = entityManager.createNamedStoredProcedureQuery("Response.findFirstBookmarkGreaterThan");
query.setParameter("bookmark", bookmark);
return query.getFirstResult();
};
}
请注意,响应必须是@Entity
。
答案 2 :(得分:0)
使用本机查询,我们也可以调用存储过程。 如果你使用MySQL,那么以下将是systex:
@Query(nativeQuery = true,value = "call getEmployeeList")
List<Employee> getEmployeeList();
答案 3 :(得分:0)
这是一个古老的问题,但是经过几个小时的“阅读docs-try-error”,我遇到了同样的问题,并最终得到解决。也许这对某人可能有用。您的存储库必须如下所示:
@Repository
public interface ResponseRepository extends CrudRepository<Response, Long>{
@Procedure(name = "Response.findFirstBookmarkGreaterThan")
Response findFirstBookmarkGreaterThan(@Param("bookmark") Long bookmark);
}
键位于@Procedure批注中。对该注释进行编码时,请使用“名称”而不是“值”(默认情况下)。 Baeldung博客上的这篇文章为我提供了解决此错误的最终方法:https://www.baeldung.com/spring-data-jpa-stored-procedures。