使用JPA调用存储过程,返回存储多行数据的OUT参数(游标)

前提

想要使用JPA调用存储过程,需要使用JPA2.1以上,API详情点击 此处
数据库使用 Oracle12
JPA实现为 Hibernate

用法

定义存储过程

create or replace procedure
    findPerson(param in string, cur_search_result out sys_refcursor)
as
begin
    open cur_search_result for
        select p.* from persons p where u.name like param;
end findPerson;

这是一个简单的存储过程,根据名字模糊匹配所有人员
注意:

  1. IN参数个数没有限制
  2. 如果out参数类型为sys_refcursor,那么最好只定义这 一个out参数(JPA API限制)

JPA调用步骤

  1. 注入JPA核心对象EntityManager
    @PersistenceContext
    private EntityManager em;

JPA定义存储过程有两种方式:

  1. 基于实体类,在实体类上使用注解(需要数据库中有对应的表
  2. 直接使用EntityManager进行自定义(不需要数据库中有对应的表

此处使用第2种方式,直接使用EntityManager进行自定义:

  • 接收StoredProcedureQuery对象,注册IN/OUT参数
  • sys_refcursor类型的out参数,统一注册为 Void.class 类型,参数模式定义为 ParameterMode.REF_CURSOR
    StoredProcedureQuery procedureQuery = em.createStoredProcedureQuery("findPerson");
    procedureQuery.registerStoredProcedureParameter("param", String.class, ParameterMode.IN);
    procedureQuery.registerStoredProcedureParameter("cur_search_result", Void.class, ParameterMode.REF_CURSOR);

调用存储过程,获取结果集:

  • 由于out参数为sys_refcursor类型,JPA会将结果放在一个list中,list中的元素为Object[]
  • 一个 Object[] 为 一行数据,一个Object[]中的数组元素为 一列数据
    procedureQuery.execute();
    List searchRowList = procedureQuery.getResultList();

至此,就能使用JPA调用存储过程获取到多行数据,后续对Object[]的和实体类之间的转化,这里不再赘述
如果确实想要使用自动映射功能,请使用JPA定义存储过程的 第一种方式

总结

  • 在JPA中,如果out参数类型为sys_refcursor,那么最好只定义这 一个out参数
  • 使用#getResultList()方法获取游标fetch到的多行数据,返回结果为List<Object[]>,一个Object[]对应一行数据
  • 如果使用Oracle package,只需在定义存储过程名字时加个对应的package名前缀即可

原文地址:https://www.cnblogs.com/zhuang229/p/12227938.html

时间: 2024-08-29 14:49:02

使用JPA调用存储过程,返回存储多行数据的OUT参数(游标)的相关文章

openTSP连接sqlServer数据库&amp;jpa调用存储过程

openTSP框架下的模块都是连接mysql数据库,近期青汽有连接sqlServer数据库的需求,在调研后配置了sqlServer数据库,使用jpa调用存储过程,中间也踩了不少坑,总结一下,避免大家再掉进去. 1.首先配置sqlServer的依赖 <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>sqljdbc4</artifactId> <version

在Java语言中调用存储过程、存储函数、包头、包体

需要拷贝连接Oracle的jar包,路径如下图所示: 连接Oracle数据库的代码: package demo.utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBCUtils { private static Stri

Spring Data JPA调用存储过程实例

Spring Data JPA调用存储过程实例 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs JPA连接到数据库,调用存储过程,这样的需求很常见.本文就针对这一点,讲述如何使用Spring Data JPA调用存储过程的方法. 1.存储过程 假设存储过程如下: CREATE OR REPLACE PACKAGE test_pkg AS PROCEDURE in_only_test (inParam1 IN VARC

Java代码调用存储过程和存储方法

准备一个oracle 的JDBC jar 包:ojdbc14_11g.jar 首先找到你的 oracle 安装位置,例如: 1.创建一个JDBC数据库连接工具类: [java] view plain copy print? package com.test.db; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; i

mybatis 调用存储过程 返回游标 实例

存储过程示例: create or replace procedure Fsp_Plan_CheckPrj(v_grantno varchar2, v_deptcode number, v_cursor out sys_refcursor) is ……………… ---返回统计结果 open v_Cursor for select s.plan_code, s.plan_dept, s.plan_amount, s.exec_amount, p.cname as plan_name, d.cnam

hibernate 调用存储过程返回参数

Connection conn= getSession().connection(); CallableStatement cs=null; //指定调用的存储过程  cs = conn.prepareCall("{Call PRO_PROCESSING_COMMON.GET_STR(?,?)}");  //设置参数  cs.setString(1, "TESTSTR");  //这里需要配置OUT的参数新型  cs.registerOutParameter(2,

Java调用存储过程返回数组

Java调用存储过程: 结合SQL操作与存储过程 create procedure set_death_age(poet VARCHAR2, poet_age NUMBER) poet_id NUMBER; begin SELECT id INTO poet_id FROM poets WHERE name = poet; INSERT INTO deaths (mort_id, age) VALUES (poet_id, poet_age); end set_death_age; 下面是调用上

SQL学习(三)Select语句:返回前多少行数据

在实际工作中,我们可能根据某种排序后,只需要显示前多少条数据,此时就需要根据不同的数据库,使用不同的关键字 一.SQL Server/Access select top 数量/百分比 from table 如: select top 10 from ticket---返回ticket表中的前10行数据 select top 10 from ticket where name='测试'---返回ticket表中,name为测试的前10行数据 select top 10 from ticket or

返回前多少行数据

在实际工作中,我们可能根据某种排序后,只需要显示前多少条数据,此时就需要根据不同的数据库,使用不同的关键字 一.SQL Server/Access select top 数量/百分比 from table 如: select top 10 from ticket---返回ticket表中的前10行数据 select top 10 from ticket where name='测试'---返回ticket表中,name为测试的前10行数据 select top 10 from ticket or