У меня есть несколько представлений SQL с составными первичными ключами, которые я хочу запросить, и так как В спящем режиме, делает это болью для работы с составным объектом keyes, я использую createSQLQuery
. Проблема состоит в том, что этот метод может только возвратить Список, и я должен обратиться к colums их индексом.
Шанс я мог сделать что-то как jdbc и обратиться к столбцам их именем sql вместо их индекса?
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.
Ваш вопрос неоднозначен - в первом абзаце вы хотите ссылаться на столбцы по индексу, а во втором - по имени sql. Поскольку по индексу несложно, буду считать по имени.
Прежде всего, вы можете использовать метод doWork
для доступа к базовому соединению JDBC и обрабатывать его так же, как и с чистым JDBC:
session.doWork(new Work() {
public void execute(Connection connection) throws SQLException {
connection.prepareStatement(...
}
});
Или вы можете использовать query.getReturnAliases
, который возвращает String []
имен столбцов. Для эффективности я бы, вероятно, построил Map
псевдонима для индексации, а затем вы могли бы сделать что-то вроде result [map.get ("имя столбца")]
.
Но на самом деле Hibernate довольно легко обрабатывает составные ключи при использовании сопоставлений xml (не пробовал с аннотациями). Это немного больше работы, и есть несколько проблем со сложными отношениями (в основном, когда имена / интервалы внешних ключей не совпадают), но как только вы создадите класс id и сопоставите его, вы можете придерживаться HQL / Критерии и получите все преимущества отложенной загрузки, простых соединений, грязных проверок и т. Д.