Подтвердить что ты не робот

Использование имен столбцов sql в hibernate createSQlquery result

У меня есть несколько представлений sql с составными первичными ключами, которые я хочу запросить, и поскольку Hibernate заставляет работать с составными ключами, я использую createSQLQuery. Проблема в том, что этот метод может возвращать только List, и мне нужно ссылаться на colums по их индексу.

Если бы я мог сделать что-то вроде jdbc и ссылаться на столбцы по их имени sql вместо их индекса?

4b9b3361

Ответ 1

Query query=session.createSQLQuery("your query");
query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);
List<Map<String,Object>> aliasToValueMapList=query.list();

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

Примечание. Эта работа для SQLQuery, если вы используете AliasToEntityMapResultTransformer по запросу hql без указания псевдонимов, вы получите значение индекса в качестве ключа.

Если вы снова преобразуете aliasToValueMapList в свой список POJO, я советую вам создать свой собственный ResultTransformer и вернуть свой пользовательский объект из метода transformTuple.

Ответ 2

Ваш вопрос неоднозначен - в первом абзаце вы хотите ссылаться на столбцы по индексу, а во втором - по имени sql. Поскольку по индексу легко, я буду считать по имени.

Прежде всего, вы можете использовать метод doWork для доступа к базовому соединению JDBC и обрабатывать его так же, как с помощью чистого JDBC:

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

Или вы можете использовать query.getReturnAliases, который возвращает String [] имен столбцов. Для effciency я бы, вероятно, построил карту псевдонима для индексации, а затем вы можете сделать что-то вроде результата [map.get( "имя столбца" )].

Но на самом деле, Hibernate легко справляется с составными ключами при использовании сопоставлений xml (не пробовал с аннотациями). Это немного больше, и есть несколько проблем со сложными отношениями (в основном, когда имена/интервалы внешнего ключа не совпадают), но как только вы создадите класс id и нарисуете его, вы можете придерживаться HQL/Criteria и получить все преимущества ленивой загрузки, простые соединения, грязная проверка и т.д.

Ответ 3

Метод, указанный в приведенном выше комментарии:

 query.getReturnAliases()

на самом деле не работает для меня:

Caused by: java.lang.RuntimeException: SQL queries do not currently support returning aliases in query:

Ответ 4

У меня такая же проблема, но она решена, когда я использовал это Запрос запроса = session.createSQLQuery( "ваш запрос" ); query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);

Я получаю результат с именем заголовка, но у меня возникла новая проблема, когда я создаю новый столбец в sql-запросе. Выберите "DCA5E3" как Shipmentcolor from Employee.class Но в этом случае я получил SHIPMENTCOLOR: "D". Как получить всю ценность SHIPMENTCOLOR.