当前位置: 首页 > 知识库问答 >
问题:

在JPA中使用Spring数据调用存储过程

梁丘佑运
2023-03-14

我想知道是否可以使用Spring数据JPA调用存储过程,它具有resultset和multiple out参数。

我发现了相同https://github.com/spring-projects/spring-data-examples/issues/80的Git问题

如果问题解决了,有人能举一个Spring Boot的例子吗?

共有1个答案

颜哲彦
2023-03-14

我过去实现这一点的方法是将自定义行为添加到Spring Data JPA存储库(链接)。在其中,我得到了EntityManager并使用java.sql.Connection和Callable语句

编辑:添加高级示例代码。示例假设您正在使用Hibernate,但想法也应该适用于其他人

假设您有一个实体存储库

public interface EntityRepositoryCustom {

    Result storedProcCall(Input input);
}

public class EntityRepositoryImpl implements EntityRepositoryCustom {

    @PersistenceContext
    private EntityManager em;

    @Override
    public Result storedProcCall(Input input) {
        final Result result = new Result();
        Session session = getSession();
        // instead of anonymous class you could move this out to a private static class that implement org.hibernate.jdbc.Work
        session.doWork(new Work() {

            @Override
            public void execute(Connection connection) throws SQLException {
                CallableStatement cs = null;
                try {
                    cs = connection.prepareCall("{call some_stored_proc(?, ?, ?, ?)}");
                    cs.setString(1, "");
                    cs.setString(2, "");
                    cs.registerOutParameter(3, Types.VARCHAR); 
                    cs.registerOutParameter(4, Types.VARCHAR); 
                    cs.execute();

                    // get value from output params and set fields on return object
                    result.setSomeField1(cs.getString(3));
                    result.setSomeField2(cs.getString(4));
                    cs.close();

                } finally {
                    // close cs
                }
            }
        });
        return result;
    }

    private Session getSession() {
        // get session from entitymanager. Assuming hibernate
        return em.unwrap(org.hibernate.Session.class);
    }

}
 类似资料:
  • 我阅读了如何在JPA中调用mysql存储过程 调用存储过程jpa 但是我的程序api没有输出passe! 如何在spring数据jpa中调用它并返回结果 Java实体 我的回购 还有我的测试 out p6间谍通话没问题!但在日志中 16:26:30[INFO][main] [] [] LocalContainerEntityManagerFactoryBean:初始化的JPA EntityMana

  • 我突然想到,可以用三个基于泛型的类来替换每个对象类型的多个类,从而节省大量的样板代码。我不是很清楚该怎么做,事实上这是不是一个好主意?

  • 问题内容: 我希望能够在PetaPoco中使用命名参数调用存储的proc。 为了调用执行搜索/获取的存储过程: 我可以做这样的事情: 另外,如何调用执行插入操作的存储过程? 谢谢,Nac 问题答案: 更新: 我尝试了以下操作来进行获取和插入,并且效果很好: 可以进一步改进以传递SQL参数。

  • 问题内容: 我试图在postgres 9.3上使用sql调用函数内的函数。 这个问题与我的另一篇文章有关。 我写了下面的函数。到目前为止,我还没有合并任何类型的save-output(COPY)语句,因此我试图通过创建嵌套函数print-out函数来解决此问题。 以上功能有效。 尝试创建嵌套函数。 调用嵌套函数。 输出 上面给出了这个。但是,当在print_out()中将arg1,arg2替换为’

  • 问题内容: 我正在编写一个简单的Web应用程序以调用存储过程并检索一些数据。它是一个非常简单的应用程序,可以与客户的数据库进行交互。我们传递员工ID和公司ID,存储过程将返回员工详细信息。 Web应用程序无法更新/删除数据,并且正在使用SQL Server。 我正在Jboss AS中部署Web应用程序。我应该使用JPA访问存储过程还是。在这种情况下使用JPA的任何优势。 调用该存储过程的sql语句

  • 问题内容: 编辑:虽然此问题中的某些答案可能会帮助其他人解决不同的问题,但该解决方案实际上与数据库连接上的自动提交功能中的某些错误有关! 执行查询后强制执行提交会使数据库反映更改,因此下面显示的代码是调用此类型存储过程的正确方法 我正在尝试在oracle数据库中调用一个简单的存储过程。 该过程如下所示: 我遇到麻烦的Java代码如下所示 我根本没有收到任何错误,但是没有反映出数据库更改。当我在SQ