如何在Hibernate的HQL中转义保留字

我使用以下查询来获取带有索引idtextobjectjava.util.Map

 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中转义别名的方法是什么?

使用反引号会出现以下错误:

 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 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 

(注意:我不是说将“where”作为列名称是个好主意;-)

back tics概念在hibernate中工作..不幸的是,这只有在你完成注释配置时才有效…

您可以尝试以不同的方式执行此操作(无需注释)。

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

在这里,您需要创建一个使用中的构造函数,该构造函数按顺序接受id,name,object元素。

反引号不能用于别名吗? Hibernate文档说它们用于字段。

其他问题:

  • 另一个价值可能吗?
  • 为什么地图(它也包含原始值)而不是List? 可以从原始对象中检索Id和Name。