【问题标题】:Spring-data-jpa NativeQuery with two output params具有两个输出参数的 Spring-data-jpa NativeQuery
【发布时间】:2013-02-20 09:46:00
【问题描述】:

我使用带有 spring-data-jpa 的 oracle 存储过程。在大多数情况下,它非常好,当它是一个函数或输出参数时,它是参数列表中的第一个。但是我有一些存储过程,输出参数是参数列表中的最后一个:

procedure get_data (some_val in varchar2 cur out sys_refcursor); 

或返回多个输出引用,如

procedure get_my_data (cur1 out sys_refcursor, cur2 out sys_refcursor, some_val in varchar2); 

是否可以通过任何方式将其与 JpaRepository 一起使用?

【问题讨论】:

    标签: java spring jpa stored-procedures spring-data


    【解决方案1】:

    终于,我自己找到了答案:)

    我的情况是使用spring-data的Custom Implementation的好点 你应该:

    1. 使用您的新创建接口,命名为 YourRepository*Custom* 方法(例如 EmployeeRepositoryCustom)
    2. 为此接口创建一个具有名称的模拟 YourRepository*Impl*(例如 EmployeeRepositoryImpl)
    3. 您可以使用的内部方法实现 SimpleJdbcCall 用于调用 Oracle 存储过程,例如
    4. ...
    5. 利润!!!

    注意:如果你想使用默认配置,命名规则很重要

    【讨论】:

      【解决方案2】:

      嗯, 如果您想从服务或实用程序类对 StoredProc 进行本地化调用,则可以将 Spring Jdbc 用于 StoredProc。实现见下文

      public class StoredProcSampleTest extends StoredProcedure {
      private static final String SPROC_NAME = "HH_EXTRACT.SAMPLE_TEST";
      public StoredProcSampleTest(DataSource dataSource) {
          super(dataSource, SPROC_NAME);
          declareParameter(new SqlParameter("v_in_msg", Types.VARCHAR));
          declareParameter(new SqlOutParameter("v_out_msg", Types.VARCHAR));
          compile();
      }
      
      public  String  execute() {
          HashMap<String, Object> hmap = new HashMap<String, Object>();
          hmap.put("v_in_msg", "Suresh");
          hmap.put("v_out_msg", "");
          Map<String, Object> results = execute(hmap);
          String outRes = (String) results.get("v_out_msg");
          return outRes;    
      }
      

      }

      现在在您的实用程序类或服务类中,执行此操作

          protected StoredProcSampleTest storedProcSampleTest;
      
      
      @Autowired
      public void setDataSource(final DataSource dataSource) {
          this.storedProcSampleTest = new StoredProcSampleTest(dataSource);
      
      }
      

      public String callStoredProcSampleTest(){
          return storedProcSampleTest.execute();
      }
      

      【讨论】:

      • 我发现它对 PostgreSQL procedure 调用很有用,我只需要在过程名称中添加“call”并覆盖isSqlReadyForUse() 函数。存储的函数可以在 PostgreSQL 上使用 JPA/Spring Data 开箱即用。
      猜你喜欢
      • 2015-07-06
      • 2022-01-21
      • 2019-01-27
      • 2018-05-20
      • 1970-01-01
      • 2017-04-18
      • 2021-01-24
      • 2016-09-30
      • 2014-12-06
      相关资源
      最近更新 更多