Как избежать зарезервированных слов в Hibernate’s HQL

Я использую следующий запрос для получения java.util.Map с id , text и object индексов:

 Query q = mySession.createQuery( "SELECT u.id AS id, u.name AS text, u AS object FROM User u") .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); 

… но object кажется зарезервированным словом. Например, obj в порядке. Каков текущий способ избежать псевдонима в HQL, как MySQL использует обратные экраны?

Использование backtick дает следующую ошибку:

 Exception in thread "main" org.hibernate.QueryException: unexpected char: '`' [SELECT u.id AS id, u.name AS text, u AS `object` FROM User u] 

Вы можете достичь этого путем обхода, используя свой настраиваемый трансформатор «alias to map», поэтому ваш код изменится на что-то вроде этого

 Query q = mySession.createQuery( "SELECT u.id AS id, u.name AS text, u AS obj FROM User u") .setResultTransformer( AliasToMapTransformer.renameAlias("obj", "object").build() ); 

И затем, используя этот class:

 public class AliasToMapTransformer extends BasicTransformerAdapter { private Map renameAliasMap; public AliasToMapTransformer(Map renameAliasMap) { this.renameAliasMap = (renameAliasMap == null) ? Collections.emptyMap() : renameAliasMap; } @Override public Object transformTuple(Object[] tuple, String[] aliases) { Map result = new HashMap(tuple.length); for (int i = 0; i < tuple.length; i++) { String alias = aliases[i]; if (alias != null) { String newAlias = renameAliasMap.get(alias); result.put((newAlias != null) ? newAlias : alias, tuple[i]); } } return result; } public static Builder renameAlias(String alias, String newAlias) { return new Builder().renameAlias(alias, newAlias); } public static class Builder { private Map aliasConversionMap = new HashMap(); public Builder renameAlias(String alias, String newAlias) { aliasConversionMap.put(alias, newAlias); return this; } public AliasToMapTransformer build() { return new AliasToMapTransformer(aliasConversionMap); } } } 

По соответствующей теме избегание зарезервированного слова в имени столбца так же просто, как добавление с псевдонимом таблицы. Без выводов, квадратных скобок и т. Д. Просто замените

 select where from mytable 

от:

 select t.where from mytable t 

(обратите внимание: я не говорю, что неплохо иметь «где» в качестве имени столбца 😉

концепция back tics работает в спящем режиме. К сожалению, это работает, только если вы выполнили конфигурацию аннотаций …

вы можете попытаться сделать это по-другому (без аннотаций).

 Query q = session.createQuery("select new User (u.id, u.name, u.object) from User u").list(); 

здесь вам нужно создать используемый конструктор, который принимает идентификатор, имя, элементы объекта & в этом порядке.

Неужели backticks не работают с псевдонимами? В документации Hibernate говорится о том, чтобы использовать их для полей.

Другие вопросы:

  • Возможно ли другое значение?
  • Почему карта (она также содержит исходное значение), а не список? Идентификатор и имя могут быть получены из исходного объекта.
  • Граница с закругленными углами и прозрачностью
  • Разбор очень больших XML-документов (и немного больше) в java
  • Как установить параметры JVM для тестов Junit Unit?
  • В JDK 1.8 отображается искажение качания, исправлено в JDK 1.7
  • JComboBox в ячейке JTable
  • Ява-выражение Java 8 и значения первого classа
  • Сообщение maven "не может найти символ" бесполезно
  • Оценка математического выражения, заданного в виде строки
  • Является ли lambda-выражение созданием объекта в куче каждый раз, когда оно выполняется?
  • Как читать stream pdf в angularjs
  • Странное поведение Java. Тернарный оператор
  • Interesting Posts

    Как заставить виртуальную виртуальную машину (запускать Ubuntu) запускать команду после возобновления ее состояния?

    Как я могу объединить два сценария AutoHotkey в один?

    Проводник Windows занимает 30 секунд. Как я могу узнать, почему?

    Active Directory (LDAP) – проверка заблокированной учетной записи / срок действия пароля истек

    Применение MVC с помощью JavaFx

    Беспроводный интернет стал очень медленным на моем 27-дюймовом IMac

    Создание нового компьютера – без дисплея, без звуковых сигналов

    Как подключить stderr, а не stdout?

    как сделать свою функцию swap в java?

    Как связать ссылку на ячейку с листом

    Звук иногда не работает для некоторых программ в Windows 7, даже из диалога Mixer

    В java, эффективнее ли использовать байты или короткие вместо int и float вместо double?

    Разница между новыми и отменой

    Почему компилятор c # испускает Activator.CreateInstance при вызове new in с общим типом с новым () ограничением?

    Можно ли установить Windows 8 с помощью Microsoft Virtual PC?

    Давайте будем гением компьютера.