如何在Hibernate的HQL中逃避保留字

时间:2011-04-16 12:20:02

标签: java hibernate hql

我使用以下查询来获取包含java.util.Mapidtext索引的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中转义别名的当前方法是什么?

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

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

4 个答案:

答案 0 :(得分:10)

您可以通过使用自定义“别名映射”转换器的解决方法来实现它,因此您的代码将更改为此类

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);
        }
    }
}

答案 1 :(得分:5)

在相关主题上,转义列名中的保留字就像使用表别名前置一样简单。没有反引号,方括号等。只需替换

select where from mytable

由:

select t.where from mytable t

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

答案 2 :(得分:2)

后面的抽搐概念在hibernate中起作用..不幸的是,这只有在你完成注释配置时才有效...

你可以尝试以不同的方式做到这一点(没有注释)。

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

这里你需要创建一个使用中的构造函数,它接受一个id,name,object元素和&amp;按此顺序。

答案 3 :(得分:0)

反引号不能用于别名吗? Hibernate documentation表示将它们用于字段。

其他问题:

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