spring-data-jpa 如何在Sping Boot 中调用存储过程?

dkqlctbz  于 2022-11-10  发布在  Spring
关注(0)|答案(3)|浏览(203)

对存储过程进行多次删除查询会产生如下所示的错误消息。

CREATE OR REPLACE PROCEDURE delete_dim_page(_page_id bigint)
 LANGUAGE plpgsql
 AS $procedure$

begin
   delete from page_catalog where page_type_id = _page_id;
   delete from page_type where page_type_id = _page_id;
END;
$procedure$
;

//实体类

@NamedStoredProcedureQuery(
    name = "firstProcedure",
    procedureName = "delete_dim_page",
    parameters = {
        @StoredProcedureParameter(
            mode=ParameterMode.IN,
            name="_page_id",
            type = Long.class
        )
    }
)

//service.java

StoredProcedureQuery query = em.createNamedStoredProcedureQuery("firstProcedure");
    query.setParameter("_page_id", pageTypeId);
    query.execute();

收益率
错误:delete_dim_page1(bigint)是一个过程
提示:若要调用过程,请使用CALL。
在Sping Boot 中调用存储过程的推荐方法是什么?

6ss1mwsb

6ss1mwsb1#

我想你使用的是spring data jpa。你可以创建一个jpa存储库,然后用这样的声明调用你的过程:

public interface PageCatalogRepository extends JpaRepository<PageCatalogEntity , Void> {
    @Query(value = "CALL firstProcedure(:page_id);", nativeQuery = true)
    void deletePageCatalogById(@Param("page_id") Long page_id);
}

您可以在这里找到其他过程调用方法https://www.baeldung.com/spring-data-jpa-stored-procedures

atmip9wb

atmip9wb2#

另一种方法是使用注解@Procedure

import org.springframework.data.jpa.repository.query.Procedure;
...
public interface PageCatalogRepository extends JpaRepository<PageCatalogEntity , String> {
   @Procedure
   public String firstProcedure(Long page_id);
}
lh80um4z

lh80um4z3#

当使用 Boot 时,有几种方法可以调用存储过程。Spring提供了一组有用的注解,可用于处理存储过程。
@Procedure注解有助于Map实体类中定义的存储过程。
当使用@Procedure注解时,出现以下异常org.springframework.dao.InvalidDataAccessApiUsageException: Type cannot be null; nested exception is java.lang.
我参考了Spring Boot Stored Procedure Example来解决上述异常,并了解如何使用@Query的替代解决方案来实现带参数和不带参数的选择、更新和删除存储过程。

public interface EmployeeRepository extends JpaRepository<Employee, Long> {

    @Query(nativeQuery = true, value = "call get_employees")
    List<Employee> getAllEmployees();

    @Query(nativeQuery = true, value = "call get_employee_id(:emp_id)")
    Employee getEmployeeById(@Param("emp_id") Long emp_id);

    @Transactional
    @Modifying
    @Query(nativeQuery = true, value = "call delete_emp_id(:emp_id)")
    void deleteEmployeeById(@Param("emp_id") Long emp_id);

相关问题