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 VARCHAR2);
   PROCEDURE in_and_out_test (inParam1 IN VARCHAR2, outParam1 OUT VARCHAR2);
END test_pkg;
/
CREATE OR REPLACE PACKAGE BODY test_pkg AS
   PROCEDURE in_only_test(inParam1 IN VARCHAR2) AS
   BEGIN
      DBMS_OUTPUT.PUT_LINE(‘in_only_test‘);
   END in_only_test;
   PROCEDURE in_and_out_test(inParam1 IN VARCHAR2, outParam1 OUT VARCHAR2) AS
   BEGIN
      outParam1 := ‘Woohoo Im an outparam, and this is my inparam ‘ || inParam1;
   END in_and_out_test;
END test_pkg;

这里有两个存储过程:

1)in_only_test

它需要一个输入参数inParam1,但不返回值

2)in_and_out_test

它需要一个输入参数inParam1,且返回值outParam1

2、@NamedStoredProcedureQueries

我们可以使用@NamedStoredProcedureQueries注释来调用存储过程。

@Entity
@Table(name = "MYTABLE")
@NamedStoredProcedureQueries({
        @NamedStoredProcedureQuery(name = "in_only_test", procedureName = "test_pkg.in_only_test", parameters = {
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "inParam1", type = String.class) }),
        @NamedStoredProcedureQuery(name = "in_and_out_test", procedureName = "test_pkg.in_and_out_test", parameters = {
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "inParam1", type = String.class),
                @StoredProcedureParameter(mode = ParameterMode.OUT, name = "outParam1", type = String.class) }) })
public class MyTable implements Serializable {
}

关键要点:

  • 存储过程使用了注释@NamedStoredProcedureQuery,并绑定到一个JPA表。
  • procedureName是存储过程的名字
  • name是JPA中的存储过程的名字
  • 使用注释@StoredProcedureParameter来定义存储过程使用的IN/OUT参数

3、创建Spring Data JPA数据库

下面我们来创建Spring Data JPA数据库:

public interface MyTableRepository extends CrudRepository<MyTable, Long> {
    @Procedure(name = "in_only_test")
    void inOnlyTest(@Param("inParam1") String inParam1);

    @Procedure(name = "in_and_out_test")
    String inAndOutTest(@Param("inParam1") String inParam1);
}

关键要点:

  • @Procedure的name参数必须匹配@NamedStoredProcedureQuery的name
  • @Param必须匹配@StoredProcedureParameter注释的name参数
  • 返回类型必须匹配:in_only_test存储过程返回是void,in_and_out_test存储过程必须返回String

4、调用

我们可以这样调用存储过程:

    // 向存储过程传递参数并返回值
    String inParam = "Hi Im an inputParam";
    String outParam = myTableRepository.inAndOutTest(inParam);
    Assert.assertEquals(outParam, "Woohoo Im an outparam, and this is my inparam Hi Im an inputParam");
    // 向存储过程传递参数不返回值
    myTableRepository.inOnlyTest(inParam);

5、其它技巧

如果上面的代码不工作,可以这么解决。定义自定义的Repository来调用存储过程昨晚本地查询。

定义自定义的Repository:

public interface MyTableRepositoryCustom {
    void inOnlyTest(String inParam1);
}

然后要确保主Repository类继承了这个接口。

public interface MyTableRepository extends CrudRepository<MyTable, Long>, MyTableRepositoryCustom {
}

6、创建Repository实现类

接着该创建Repository实现类了:

public class MyTableRepositoryImpl implements MyTableRepositoryCustom {

@PersistenceContext

private EntityManager em;

@Override
public void inOnlyTest(String inParam1) {
    this.em.createNativeQuery("BEGIN in_only_test(:inParam1); END;").setParameter("inParam1", inParam1)
            .executeUpdate();
}

}

可以以常规的方式进行调用:

@Autowired
MyTableRepository myTableRepository;
// 调用存储过程
myTableRepository.inOnlyTest(inParam1);

是不是很简单。

时间: 2024-11-03 22:05:54

Spring Data JPA调用存储过程实例的相关文章

spring boot + spring data jpa

Spring Data Repository的核心接口是Repository(好像也没什么好惊讶的).这个接口需要领域类(Domain Class)跟领域类的ID类型作为参数.这个接口主要是让你能知道继承这个类的接口的类型.CrudRepository 供了对被管理的实体类的一些常用CRUD方法. 2. springboot 整合spring data jpa 默认你已经构建好了spring boot 项目,关于spring boot项目的新建,请参考: springboot Demo spri

Spring ORM+Hibernate?Out!换 Spring Data JPA 吧!

转载请注明出处:http://blog.csdn.net/anxpp/article/details/51415698,谢谢! 在一切开始之前,先举个简单的例子,以提高大家的兴致! 如果一张表user有三个字段,id.name和age,要查找指定姓氏在某年龄以上的user,在传统的Spring+Hibernate中,dao层我们是这样写的: UserDao: public interface UserDao{ List<User> findByNameLikeAndAgeGreaterThan

Spring Data JPA、 MyBatis与Hibernate简单对比

整体参考: https://blog.csdn.net/xihuanyuye/article/details/81201441 详细参考: https://blog.csdn.net/qq897958555/article/details/53208002 1.Spring Data JPA与Hibernate Spring Data JPA是Spring Data的子模块.使用Spring Data,使得基于“repositories”概念的JPA实现更简单和容易.Spring Data JP

Hibernate、Mybatis与Spring Data JPA的区别

1.概念: Hibernate:Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库.属于全自动的ORM框架,着力点在于POJO和数据库表之间的映射,完成映射即可自动生成和执行sql. Mybatis:MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .

Spring Data Jpa (四)注解式查询方法

详细讲解声明式的查询方法 1 @Query详解 使用命名查询为实体声明查询是一种有效的方法,对于少量查询很有效.一般只需要关心@Query里面的value和nativeQuery的值.使用声明式JPQL查询有一个好处,就是启动的时候就知道语法正确与否. 声明一个注解在Repository的查询方法上. Like查询,注意firstname不会自动加上%关键字的 直接用原始SQL. nativeQuery不支持直接Sort的参数查询 错误方式: 正确方式: [email protected]排序

深入浅出学Spring Data JPA

第一章:Spring Data JPA入门   Spring Data是什么 Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务. Spring Data 包含多个子项目: Commons - 提供共享的基础框架,适合各个子项目使用,支持跨数据库持久化 JPA - 简化创建 JPA 数据访问层和跨存储的持久层功能 Hadoop - 基于 Spring 的 Hadoop 作业配置和一个 P

Spring Data JPA例子[基于Spring Boot、Mysql]

关于Spring Data Spring社区的一个顶级工程,主要用于简化数据(关系型&非关系型)访问,如果我们使用Spring Data来开发程序的话,那么可以省去很多低级别的数据访问操作,如编写数据查询语句.DAO类等,我们仅需要编写一些抽象接口并定义相关操作即可,Spring会在运行期间的时候创建代理实例来实现我们接口中定义的操作. 关于Spring Data子项目 Spring Data拥有很多子项目,除了Spring Data Jpa外,还有如下子项目. Spring Data Comm

学习Spring Data Jpa

首先,抛开Spring,先来谈谈JPA.      1.JPA是什么? JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中.  说到底还是一个ORM框架,不过是Sun为了希望整合所有的ORM框架而推出的规范,总的来说没有什么大的区别.依旧是是开发者从复杂的SQL与JDBC中脱离出来.       2.实际中使用JPA 首先在数据库中建库与表,MySQL中脚本如下 1 CREATE DATABAS

spring data jpa自定义baseRepository

在一些特殊时候,我们会设计到对Spring Data JPA中的方法进行重新实现,这将会面临一个问题,如果我们新创建一个实现类.如果这个实现类实现了JpaRepository接口,这样我们不得不实现该接口中的所有方法,如果不实现该接口,那意味着我们就无法使用Spring Data JPA中给我们提供的那些好用的方法.所以在扩展的时候我们需要按照如下方法进行. 这些需要注意的是,接口和实现类的名称必须遵循spring data jpa的命名规范,如果要为接口StudentBaseRepositor