Как получить набор результатов JDBC с помощью спящего режима. В одном случае я хочу вызвать хранимую процедуру, которая выполняет некоторые вычисления и выбирает некоторые столбцы из нескольких таблиц.
Поэтому в моей хранимой процедуре у меня есть что-то вроде
selct sum(c1) as TotalVal, avg(c2) as AverageVal from ....
Итак, я хочу получить эти значения столбца в своем java-коде и сделать еще немного обработки. Однако я не могу получить ResultSet вызова процедуры в Java-коде.
Может ли кто-нибудь дать мне знать, как это сделать?
Я использую Hibernate4 и поэтому не могу найти метод session.connection()
. Кроме того, я пытался с doWork()
, но как я могу получить набор результатов из внутреннего класса Work
Вы можете использовать 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 связан с соединением JDBC, которое должно храниться в методе execute()
.
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(), как показано в ответе Джека.
persistence
фреймворк, где вы можетеsave
. Не "только для чтения-рамки". Вы можете подделать его с помощьюviews
которые читаются сеансами без сохранения состояния, но гибернация приведет к аварийному завершению при сохранении в этих представлениях. Я с уважением советую против использования hibernate.