Java的JPA-执行存储过程

53 篇文章 0 订阅
  1. 导入必要的依赖:首先,在项目的pom.xml文件中添加如下依赖:
<dependency>
    <groupId>javax.persistence</groupId>
    <artifactId>javax.persistence-api</artifactId>
    <version>2.2</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.4.30.Final</version>
</dependency>
  1. 创建实体类:根据存储过程的输入输出参数,创建对应的实体类,并使用@Entity注解标记该类为实体类。例如,假设存储过程的输入参数为id和name,输出参数为result,那么可以创建如下实体类:
@Entity
public class MyEntity {
    @Id
    private Long id;
    private String name;
    private String result;
    
    // getter and setter methods
}
  1. 定义存储过程的调用方法:创建一个接口,并使用@NamedStoredProcedureQuery注解标记该接口为存储过程调用接口。在接口中定义用于调用存储过程的方法,并使用@Procedure注解指定存储过程的名称和参数。例如,假设存储过程的名称为my_procedure,参数为id和name,可以创建如下接口:
@NamedStoredProcedureQuery(
    name = "MyEntity.callMyProcedure",
    procedureName = "my_procedure",
    parameters = {
        @StoredProcedureParameter(mode = ParameterMode.IN, name = "id", type = Long.class),
        @StoredProcedureParameter(mode = ParameterMode.IN, name = "name", type = String.class),
        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "result", type = String.class)
    }
)
public interface MyEntityRepository extends JpaRepository<MyEntity, Long> {
    @Procedure("my_procedure")
    void callMyProcedure(@Param("id") Long id, @Param("name") String name);
}
  1. 使用存储过程:在需要调用存储过程的地方,注入MyEntityRepository接口,并调用callMyProcedure方法。例如,可以在控制器中进行如下调用:
@RestController
public class MyController {
    @Autowired
    private MyEntityRepository myEntityRepository;
    
    @GetMapping("/callProcedure")
    public void callProcedure() {
        Long id = 1L;
        String name = "John Doe";
        myEntityRepository.callMyProcedure(id, name);
    }
}

需要注意的是,使用JPA进行纯SQL操作存储过程时,需要注意以下几点:

  • 存储过程的输入输出参数需要在实体类中定义,并且需要使用@Procedure注解指定存储过程的名称和参数。
  • 调用存储过程的方法需要在存储过程调用接口中定义,并且需要使用@Procedure注解指定存储过程的名称和参数,并使用@Param注解指定参数的名称。
  • 需要在项目的配置文件中配置JPA和Hibernate的相关配置,如数据库连接信息、实体类扫描路径等。
  • 确保数据库中存在对应的存储过程,并且存储过程的名称和参数与代码中定义的一致。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
注意,以下使用数据库为sql2000,驱动jtds1.2.2 一、调用存储过程(无结果集返回) Connection connection = ConnectionHelper.getConnection(); CallableStatement callableStatement = connection.prepareCall("{ call procedureName(?,?) }"); callableStatement.setString(1, "xxxxxxxx"); callableStatement.setString(2, "xxxxxxxx"); callableStatement.execute(); //获得sql的消息并输出,这个估计很多人都需要 SQLWarning sqlWarning = callableStatement.getWarnings(); while (sqlWarning != null) { System.out.println("sqlWarning.getErrorCode() = " + sqlWarning.getErrorCode()); System.out.println("sqlWarning.getSQLState() = " + sqlWarning.getSQLState()); System.out.println("sqlWarning.getMessage() = " + sqlWarning.getMessage()); sqlWarning = sqlWarning.getNextWarning(); } //close ConnectionHelper.closeConnection(callableStatement, connection); 二、调用存储过程,返回sql类型数据(非记录集) Connection connection = ConnectionHelper.getConnection(); CallableStatement callableStatement = connection.prepareCall("{ call procedureName(?,?,?) }"); callableStatement.setString(1, "xxxxxxxx"); callableStatement.setString(2, "xxxxxxxx"); //重点是这句1 callableStatement.registerOutParameter(3, Types.INTEGER); callableStatement.execute(); //取返回结果,重点是这句2 //int rsCount = callableStatement.getInt(3); //close ConnectionHelper.closeConnection(callableStatement, connection); 三、重点来了,返回记录集,多记录集 注意,不需要注册返回结果参数,只需要在sql中select出结果即可 例如:select * from tableName 即可得到返回结果 Connection connection = ConnectionHelper.getConnection(); CallableStatement callableStatement = connection.prepareCall("{ call procedureName(?) }"); //此处参数与结果集返回没有关系 callableStatement.setString(1, "xxxxxxxx"); callableStatement.execute(); ResultSet resultSet = callableStatement.getResultSet(); //以上两个语句,可以使用ResultSet resultSet = callableStatement.executeQuery();替代 //多结果返回 ResultSet resultSet2; if (callableStatement.getMoreResults()) { resultSet2 = callableStatement.getResultSet(); while (resultSet2.next()) { } } //close ConnectionHelper.closeConnection(callableStatement, connection); 提示:多结果返回可以使用如下代码(以上主要让

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

123的故事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值