Используя sql имена столбцов в в спящем режиме результат createSQlquery

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

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

20
задан Trilarion 3 December 2014 в 12:38
поделиться

2 ответа

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.

47
ответ дан 29 November 2019 в 23:19
поделиться

Ваш вопрос неоднозначен - в первом абзаце вы хотите ссылаться на столбцы по индексу, а во втором - по имени 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 / Критерии и получите все преимущества отложенной загрузки, простых соединений, грязных проверок и т. Д.

2
ответ дан 29 November 2019 в 23:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: