Как избежать зарезервированных слов в 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 дает следующую ошибку:
- Как создать Java Webapp Installer (.exe), который включает Tomcat и MySQL? "
- Как добиться условного импорта ресурсов в контексте Spring XML?
- В каком streamе выполняются обработчики завершения CompletingFuture?
- В чем разница между ConcurrentHashMap и Collections.synchronizedMap (Карта)?
- Как игнорировать создание пути PKIX не удалось: sun.security.provider.certpath.SunCertPathBuilderException?
Exception in thread "main" org.hibernate.QueryException: unexpected char: '`' [SELECT u.id AS id, u.name AS text, u AS `object` FROM User u]
- Я могу передать переменную из сценария JSP в JSTL, но не из JSTL в сценарий JSP без ошибки
- Мутируемые объекты и hashCode
- Ошибка ручки 404 с регулятором пружины
- выводить массив JSON в таблице html (страница jsp)
- Каков список допустимых имен предупреждений @SuppressWarnings в Java?
- Отображать номера от 1 до 100 без петель или условий
- Лучший компонент браузера Java / Swing?
- Выполняются ли одновременно два синхронизированных метода
Вы можете достичь этого путем обхода, используя свой настраиваемый трансформатор «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 говорится о том, чтобы использовать их для полей.
Другие вопросы:
- Возможно ли другое значение?
- Почему карта (она также содержит исходное значение), а не список? Идентификатор и имя могут быть получены из исходного объекта.