`Type cannot be null` exception when trying to run out Stored Procedure using Spring Data JPA

后端 未结 4 1443
情书的邮戳
情书的邮戳 2021-01-28 18:07

I am trying to invoke a Stored Procedure whose signature looks like the following:

CREATE OR REPLACE PROCEDURE FIND_FIRST_BOOKMARK_GT(bookmark IN NUMBER, cur OUT         


        
相关标签:
4条回答
  • 2021-01-28 18:41

    This is an old question, but I faced with same issue and get fixed finally after a couple of hours of "read docs-try-error". Maybe this could be useful to someone. Your repository must look like this:

    @Repository
    public interface ResponseRepository extends CrudRepository<Response, Long>{
        @Procedure(name = "Response.findFirstBookmarkGreaterThan")
        Response findFirstBookmarkGreaterThan(@Param("bookmark") Long bookmark);
    }
    

    The key is at @Procedure annotation. Use "name" instead of "value" (by default) when coding this annotation. This article at Baeldung blog gave me the final pull to resolve this error: https://www.baeldung.com/spring-data-jpa-stored-procedures.

    0 讨论(0)
  • 2021-01-28 18:49

    Faced with the same issue using @Procedure. As a workaround, you could refer to the entityManager in the service class and call procedure from it.

    @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();
        };
    }
    

    Note that Response must be an @Entity.

    0 讨论(0)
  • 2021-01-28 18:50

    Using native Query we can also call store procedure. If you are using MySQL then following will be the systex:

     @Query(nativeQuery = true,value = "call getEmployeeList")
     List<Employee> getEmployeeList();
    
    0 讨论(0)
  • 2021-01-28 18:52

    I was not able to get this syntax working as such, however, the notion of retrieving from a stored procedure is effectively a shorthand for selecting from (possibly a view) mixed with applying some input based function. To that effect, I have replaced my stored procedure with a function / table that yields the same effect.

    @Query("SELECT r FROM RESPONSES r WHERE BOOKMARK = FIND_FIRST_BOOKMARK_GT(:bookmark)")
    Response findFirstBookmarkGreaterThan(@Param("bookmark") Long bookmark);
    

    This uses the @Query syntax in conjunction with a table and a function, whose overall logic is identical to calling the stored procedure I had intended. Although a little more difficult to follow perhaps, the syntax is at least much shorter than using the @NamedStoredProcedureQuery.

    The function does the same thing the stored procedure originally did EXCEPT for the last part which was a SELECT INTO, this is now encapsulated as part of the @Query.

    0 讨论(0)
提交回复
热议问题