Использование имен столбцов sql в hibernate результат createSQlquery - PullRequest
20 голосов
/ 09 апреля 2010

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

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

Ответы [ 4 ]

47 голосов
/ 09 апреля 2010
Query query=session.createSQLQuery("your query");
query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);
List<Map<String,Object>> aliasToValueMapList=query.list();

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

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

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

1 голос
/ 06 сентября 2014

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

 query.getReturnAliases()

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

Caused by: java.lang.RuntimeException: SQL queries do not currently support returning aliases in query:
1 голос
/ 09 апреля 2010

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

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

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

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

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

0 голосов
/ 09 ноября 2015

У меня такая же проблема, но она решена, когда я использовал это

Query query=session.createSQLQuery("your query");
query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...