java - 如何从java代码执行批量存储过程调用?

标签 java hibernate spring-boot

我在 oracle 数据库中有一个过程,它需要两个参数:

procedure some_procedure(int x, int y)

我的项目使用的是spring boot + hibernate。那么,问题是如何使用 java 代码中的批处理(例如 100)来执行此存储过程?

我发现了一些使用 @Procedure 注释以及 StoredProcedureQuery 的示例 - 但这些仅用于简单的非批处理调用。

有人可以解释一下我什么时候应该使用 @Procedure 注释而不是 StoredProcedureQuery 吗?

最佳答案

调用存储过程时,得到的是OUT参数,不能通过调用来改变。如果存储过程返回ref_cursor,并且您想限制记录,请更改存储过程。

使用StoredProcedureQuery,您将编写更多代码并手动管理调用流程(获取entityManager、打开事务、进行调用、关闭事务...)。使用 JPA 存储库,您可以通过注释来描述过程并继续。但这两种方法都有效。

更新:

哦,小误会。您可以使用 StoredProcedureQuery 在一个事务中多次调用过程,这是您想要的吗?代码如下所示:

public class ProcedureCall {
@Autowired
private EntityManagerFactory entityManagerFactory;

public void executeProcedureWithoutResult(Map<String, ?> parameters, String procedureName) {
    EntityManager em = entityManagerFactory.createEntityManager();

    StoredProcedureQuery procedureQuery1 = em.createNamedStoredProcedureQuery(procedureName);
    StoredProcedureQuery procedureQuery2 = em.createNamedStoredProcedureQuery(procedureName);

    fillProcedureParameters(procedureQuery1, parameters);
    fillProcedureParameters(procedureQuery2, parameters);

    try {
        em.getTransaction().begin();

        procedureQuery1.execute();
        procedureQuery2.execute();

        em.getTransaction().commit();
    } catch (Exception e) {
        rollbackTransaction(e, em.getTransaction());
    } finally {
        if (em.isOpen()) {
            em.close();
        }
    }
}

private void fillProcedureParameters(StoredProcedureQuery sp, Map<String, ?> parameters) {
    if (parameters.size() > 0) {
        for (HashMap.Entry<String, ?> rec : parameters.entrySet()) {
            sp.setParameter(rec.getKey(), rec.getValue());
        }
    }
}

如果您执行一个 procedureQuery 两次,也许它甚至可以工作,但我没有尝试。

关于java - 如何从java代码执行批量存储过程调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61756789/

相关文章:

java - 如何使用 Swagger @RequestParam Map<String, String> 进行记录

java - Facebook 登录后将 Activity 重定向到 Frontpage Activity

java - hibernate 5 : db connections are still not released (idle in transaction) after lazy loading

hibernate - org.hibernate.hql.internal.ast.QuerySyntaxException : unexpected token (asf is alias for a Table)

java - Spring @Transactional 在一个方面(AOP)

javascript - 通过 Axios 发送 post 请求会在 Spring-Boot 后端生成一个空的 RequestBody。在 Postman 中工作,但不能通过 Axios 发布请求

java - 如何使用 JasperReports API 更改 JRBaseSubreport 表达式

java - 在转换为 Java 对象之前检查 xsd datetime 是否有定义的时区

java - 应该使用什么 hibernate 属性名称

java - 如何禁用 Spring Boot Hibernate "Listing entities"选项?