我用下面的查询来获得java.util.Map与指数id,text以及object:
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可以。MySQL使用反引号转义的当前方式是如何在HQL中转义 别名 ?
obj
使用反引号会出现以下错误:
Exception in thread "main" org.hibernate.QueryException: unexpected char: '`' [SELECT u.id AS id, u.name AS text, u AS `object` FROM User u]
您可以通过使用自定义“别名映射”转换器的解决方法来实现,因此您的代码将更改为如下所示
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() );
然后使用此类:
public class AliasToMapTransformer extends BasicTransformerAdapter { private Map<String, String> renameAliasMap; public AliasToMapTransformer(Map<String, String> renameAliasMap) { this.renameAliasMap = (renameAliasMap == null) ? Collections.<String, String>emptyMap() : renameAliasMap; } @Override public Object transformTuple(Object[] tuple, String[] aliases) { Map<String, Object> result = new HashMap<String, Object>(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<String, String> aliasConversionMap = new HashMap<String, String>(); public Builder renameAlias(String alias, String newAlias) { aliasConversionMap.put(alias, newAlias); return this; } public AliasToMapTransformer build() { return new AliasToMapTransformer(aliasConversionMap); } } }