Использование имен столбцов sql в hibernate createSQlquery result
У меня есть несколько представлений sql с составными первичными ключами, которые я хочу запросить, и поскольку Hibernate заставляет работать с составными ключами, я использую createSQLQuery
. Проблема в том, что этот метод может возвращать только List, и мне нужно ссылаться на colums по их индексу.
Если бы я мог сделать что-то вроде jdbc и ссылаться на столбцы по их имени sql вместо их индекса?
Ответы
Ответ 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.