zoukankan      html  css  js  c++  java
  • 使用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 class User {
        @Id @GeneratedValue
        private Long 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 class User {
        @Id @GeneratedValue
        private Long id;
    }
    public class SomeSerice {
        @Autowired
        private EntityManager entityManager;
    
        public void test() {
            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 class User {
        @Id @GeneratedValue
        private Long id;
    
        private String value1;
    
        private String value2;
    
        public User(String value1, String value2) {
            this.value1 = value1;
            this.value2 = value2;
        }
    
        //...getter setter
    }

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

    public class SomeSerice {
        @Autowired
        private EntityManager entityManager;
    
        public void test() {
            StoredProcedureQuery query = entityManager.createNamedStoredProcedureQuery("pro1");
    
            query.setParameter("arg", 1);
    
            query.execute();
    
            query.getResultList();
        }
    }
  • 相关阅读:
    协议详解1——概要
    协议学习之 vamei博客系列 总结
    DDOS介绍
    python基础教程总结15——7 自定义电子公告板
    python基础教程总结15——6 CGI远程编辑
    python基础教程总结15——5 虚拟茶话会
    python基础教程总结15——4 新闻聚合
    python基础教程总结15——3 XML构建网址
    如何在远程桌面的服务器上访问本地磁盘
    C# 如何把dataTable以参数的形式传入 sql 存储过程
  • 原文地址:https://www.cnblogs.com/white-knight/p/8378439.html
Copyright © 2011-2022 走看看