hibernate получает базовый sql resutlset. nativequery очень ограничивает

#hibernate

#hibernate

Вопрос:

hibernate получает базовый sql resutlset. nativequery очень ограничивает. мне нужно выполнить обычный sql-запрос, имея возможность доступа к результирующему набору.

org.hibernate.internal.ScrollableResultsImpl имеет защищенный доступ getResultSet . как я могу предоставить свою собственную реализацию, которая будет раскрывать resultset .

Мне нужен результирующий набор, чтобы иметь возможность получать метаданные, такие как имена столбцов. они есть.

Ответ №1:

Вы можете работать с базовым Connection напрямую, не прибегая к собственному запросу:

 session.doWork(new Work() {
    @Override
    public void execute(Connection connection) throws SQLException {
    }
});
  

Комментарии:

1. Единственная проблема в том, что мне нужно преобразовать именованный запрос в preparedstatement, используя? и преобразует его в такой. Я не понимаю, почему они его не раскрывают. так вопиюще. я могу отразить доступ к нему или, возможно, использовать устаревший resulttransformer .

Ответ №2:

Возможно, вам следует указать, чего вы на самом деле хотите достичь, а не просто жаловаться на то, что у вас не работает. Разработчики этого Hibernate API, возможно, не видели необходимости в раскрытии результирующего набора JDBC в этот момент, потому что использование может привести к незначительным ошибкам. Я лично тоже не вижу в этом необходимости и не могу представить ваш вариант использования.

Если вы используете запрос HQL, зачем вам вообще нужны псевдонимы SQL? Вы можете использовать javax.persistence.Tuple тип результата as для получения доступа к значениям по псевдониму, как в следующем примере:

 TypedQuery<Tuple> query = em.createNamedQuery("myQuery", Tuple.class);
List<Tuple> resultList = query.getResultList();
resultList.get(0).get("alias1", Integer.class);
  

Комментарии:

1. Когда вы выполняете getResulList, hibernate уже один раз просматривает результирующий набор. Мне нет необходимости повторять это снова. «Разработчики этого API Hibernate не видели в этом необходимости… бла-бла-бла» какое ужасное оправдание. Их ограниченное видение ограничивает нас, других, желающих сделать что-то еще с результатом, когда все, что им нужно было сделать, это разрешить нам доступ. Я просто отражаю получение базового частного результирующего набора. Спасибо!

2. то, что я хочу сделать, это выполнить обычный sql-запрос самостоятельно и вывести результат из результирующего набора. невозможно получить имена столбцов с помощью scrollablebullshit. это серьезная проблема. у hibernate есть способ выполнить итерацию без результирующего набора, но вы никогда не должны создавать api, который использует другой api, а также не обеспечивает доступ к базовому, на случай, если вы забыли что-то реализовать, кто-то может легко сделать все, что может базовый.

3. Я думаю, что ваш тон немного груб, поэтому я хотел бы попросить вас переосмыслить, какой язык вы здесь используете. Что такого в многократном повторении результата? Если вы хотите пройти его только один раз, используйте ResultTransformer API: vladmihalcea.com/hibernate-resulttransformer Вы говорите, что хотите использовать SQL-запрос и использовать JDBC, хорошо, тогда используйте то, что было предложено @guillaume.

4. «Может быть, вам следует указать, чего вы на самом деле хотите достичь, а не просто жаловаться на то, что у вас не работает». Вы начали грубость. Проблема в том, что это не нужно, и если вы создаете API, то вам не нужен этот дополнительный ненужный слой. resulttransformer возможен и работает, но я просто не понимаю, какого черта они скрывают базовые вещи, на которые они полагаются. Имеет нулевой смысл и плохой дизайн API. ResultTransformer, вероятно, все денди, но многое происходит до того, как этот слой фактически вызывается, и в этом нет необходимости.

5. У меня также есть куча кода, который работает с нативными наборами результатов sql и native jdbc. Принудительное использование resulttransformer затрудняет его использование и может привести к неоправданной избыточности.