使用spring-data-JPA调用存储过程

摘要:
实体类需要实现对应的构造函数。

第一种情况,对于只有一个或没有返回值的存储过程,使用如下方式调用:

@Entity
@NamedStoredProcedureQuery(name = "pro1", procedureName = "pro1", parameters ={
  @StoredProcedureParameter(mode = ParameterMode.IN, name = "arg", type = Integer.class),
  @StoredProcedureParameter(mode = ParameterMode.OUT, name = "res", type = Integer.class) })
public classUser {
    @Id @GeneratedValue
    privateLong id;
}
public interface UserRepository extends CrudRepository<User, Long>{
  @Procedure(name = "pro1")
  Integer plus1BackedByOtherNamedStoredProcedure(@Param("arg") Integer arg);
}

如果没有返回值,repository中的方法返回void即可。

第二种情况,对于有多个返回值的存储过程,使用如下方式调用:

@Entity
@NamedStoredProcedureQuery(name = "pro1", procedureName = "pro1", parameters ={
  @StoredProcedureParameter(mode = ParameterMode.IN, name = "arg", type = Integer.class),
  @StoredProcedureParameter(mode = ParameterMode.OUT, name = "res", type = Integer.class),
  @StoredProcedureParameter(mode = ParameterMode.OUT, name = "res2", type = Integer.class) })
public classUser {
    @Id @GeneratedValue
    privateLong id;
}
public classSomeSerice {
    @Autowired
    privateEntityManager entityManager;

    public voidtest() {
        StoredProcedureQuery query = entityManager.createNamedStoredProcedureQuery("pro1");

        query.setParameter("arg", 1);

        query.execute();

        Integer res = query.getOutputParameterValue("res");
        Integer res2 = query.getOutputParameterValue("res2");
    }
}

第三种情况,对于返回游标的存储过程,使用如下方式:

@Entity
@NamedStoredProcedureQuery(name = "pro1", resultSetMappings={"mapping1"} procedureName = "pro1", parameters ={
  @StoredProcedureParameter(mode = ParameterMode.IN, name = "arg", type = Integer.class),
  @StoredProcedureParameter(mode=ParameterMode.REF_CURSOR, name="cur", type=void.class) })

@SqlResultSetMapping(name="mapping1", classes={@ConstructorResult(targetClass=User.class, 
  columns={@ColumnResult(name="value1", type=String.class), @ColumnResult(name="value2", type=String.class)})})

public classUser {
    @Id @GeneratedValue
    privateLong id;

    privateString value1;

    privateString value2;

    publicUser(String value1, String value2) {
        this.value1 =value1;
        this.value2 =value2;
    }

    //...getter setter
}

注意此处,@NamedStoredProcedureQuery注解增加了resultSetMappings属性,用于定义如何将游标的返回值转换为实体类,具体实现在@SqlResultSetMapping中。实体类需要实现对应的构造函数。

public classSomeSerice {
    @Autowired
    privateEntityManager entityManager;

    public voidtest() {
        StoredProcedureQuery query = entityManager.createNamedStoredProcedureQuery("pro1");

        query.setParameter("arg", 1);

        query.execute();

        query.getResultList();
    }
}

免责声明:文章转载自《使用spring-data-JPA调用存储过程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇unity游戏中存档和读档的方法Interval 用法总结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SQL Server 存储过程具体解释

SQL Server 存储过程具体解释 存储过程的优缺点   ◆长处:   运行速度更快。存储过程仅仅在创造时进行编译,而一般SQL语句每运行一次就编译一次,所以使用存储过程运行速度更快。   存储过程用于处理复杂的操作时,程序的可读性更强、网络的负担更小。   使用存储过程封装事务性能更佳。   能有效的放注入,安全性更好。   可维护性高。在...

在ORACLE中存储过程变量名和表字段名相同

1.事件概述 今天再写存储过程使用变量没注意到问题,导致SQL执行缓慢,找了许久才发现哪里有问题。 2.发现问题 在存储过程中执行下图sql需要20秒左右,执行计划发现走了全表扫描,而在存储过程中相同的SQL不会有问题。 然后我单独把SQL拿出来跑,将变量名替换成真实数据,1秒就执行出来了,执行计划走了索引。 存储过程重新看了很久,是不是哪里有问题,变量...

MySQL存储过程之事务管理

  MySQL存储过程之事务管理 ACID:Atomic、Consistent、Isolated、Durable 存储程序提供了一个绝佳的机制来定义、封装和管理事务。 1,MySQL的事务支持 MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关: Java代码 1         MyISAM:不支持事务,用于只读程序提高性能 ...

导出所有DB2存储过程的四种方法

DB2存储过程如果要全部导出的话,是否可行呢?答案是肯定的,下面就为您介绍四种导出所有DB2存储过程的方法,希望对您学习DB2存储过程方面能有所帮助。 1) 从 DB2 的目录表 SYSCAT.ROUTINES 中选取: 在 SYSCAT.ROUTINES 系统目录表中,有一个名为 TEXT 的字段,其数据类型定义为 CLOB,长度为 2M(2097152...

【总结】数据库优化的若干方法

导图 下图是我结合自己的经验以及搜集整理的数据库优化相关内容的思维导图,如果图片不清楚,可以在浏览器中右键,在新窗口中查看(Chrome)或者查看图像(FireFox)。 常用关键字优化 在编写T-SQL的时候,会使用很多功能类似的关键字,比如COUNT和EXISTS、IN和BETWEEN AND等,我们往往会根据需求直奔主题地来编写查询脚本,完成需求要...

Oracle系统表大全(转)

下面全面是对Oracle系统表的一些介绍: 数据字典dict总是属于Oracle用户sys的。   1、用户:    select username from dba_users;   改口令    alter user spgroup identified by spgtest;   2、表空间:    select * from dba_data_fi...