Получить набор результатов JDBC в Hibernate

1

Как получить набор результатов JDBC с помощью спящего режима. В одном случае я хочу вызвать хранимую процедуру, которая выполняет некоторые вычисления и выбирает некоторые столбцы из нескольких таблиц.
Поэтому в моей хранимой процедуре у меня есть что-то вроде

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

Итак, я хочу получить эти значения столбца в своем java-коде и сделать еще немного обработки. Однако я не могу получить ResultSet вызова процедуры в Java-коде.

Может ли кто-нибудь дать мне знать, как это сделать?

Я использую Hibernate4 и поэтому не могу найти метод session.connection(). Кроме того, я пытался с doWork(), но как я могу получить набор результатов из внутреннего класса Work

  • 0
    Пожалуйста, отправьте код, который вы используете для связи с базой данных (процедура вызова).
  • 0
    Hibernate - это persistence фреймворк, где вы можете save . Не "только для чтения-рамки". Вы можете подделать его с помощью views которые читаются сеансами без сохранения состояния, но гибернация приведет к аварийному завершению при сохранении в этих представлениях. Я с уважением советую против использования hibernate.
Показать ещё 1 комментарий
Теги:
hibernate

2 ответа

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 связан с соединением JDBC, которое должно храниться в методе execute().

  • 1
    +1. Я пропустил doReturningWork () в документах.
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(), как показано в ответе Джека.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню