使用Spring Data JPA调用存储过程

时间:2017-05-11 08:52:46

标签: spring jpa stored-procedures

我想知道是否可以使用具有结果集和多个out参数的Spring Data JPA来调用存储过程。

我发现同一https://github.com/spring-projects/spring-data-examples/issues/80

的Git问题

如果解决了,有人可以提供Spring Boot的一个例子吗?

1 个答案:

答案 0 :(得分:0)

我过去完成此操作的方法是将自定义行为添加到Spring Data JPA存储库(link)。在里面我得到EntityManager并使用java.sql.Connection和CallableStatement

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

假设你有一个EntityRepository

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);
    }

}