在Hibernate中获取JDBC结果集

时间:2014-08-25 13:31:35

标签: java hibernate

如何使用hibernate获取JDBC结果集。在一种情况下,我想调用一个存储过程,它执行一些计算并从多个表中选择一些列 所以在我的存储过程中,我有类似

的东西
selct sum(c1) as TotalVal, avg(c2) as AverageVal from .... 

所以,我想在我的java代码中获取这些列值并对其进行更多处理。 但是,我无法在java代码中获取过程调用的ResultSet。

有谁能让我知道怎么做?

我正在使用Hibernate4,所以无法找到session.connection()方法。另外,我尝试使用doWork(),但是如何从内部类Work获取结果集

2 个答案:

答案 0 :(得分:5)

您可以使用Session#doReturningWork(ReturningWork)从JDBC调用中返回所需的结果:

session.beginTransaction();
ResultObject result = session.doReturningWork(new ReturningWork<ResultObject>() {

    @Override
    public ResultObject execute(Connection conn) throws SQLException {
        // execute your SQL
        // create and return result object
    });
}
session.getTransaction().commit();

// work with ResultObject

您可以直接返回JDBC-ResultSet,但我建议将值存储在单独的对象(此处为:ResultObject)中,因为ResultSet与应保留在execute()方法中的JDBC连接相关

答案 1 :(得分:1)

doWork允许您使用Hibernate提供的连接执行任何操作。所以这是一个例子:

private static class MyWork implements Work {
    private List<Foo> result = new ArrayList<>();

    @Override 
    public void execute(Connection connection) throws SQLException {
        try (PreparedStatement stmt = connection.prepareStatement(...)) {
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                Foo foo = new Foo(rs.getString(0, rs.getInt(1));
                result.add(foo);
            }
        }
    }

    public List<Foo> getResult() {
        return result;
    }
}

...

MyWork work = new MyWork();
session.doWork(work);
List<Foo> foos = myWork.getResult();

但你应该使用doReturningWork(),如Jack的回答所示。