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

toe95027  于 2022-12-10  发布在  Java
关注(0)|答案(5)|浏览(341)

我使用下面的查询来获取一个java.util.Map,它的索引为idtextobject

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中对 alias 进行转义的方法是什么,就像MySQL使用倒勾转义一样?
使用反勾会产生以下错误:

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

z4bn682m1#

您可以通过使用自定义“别名到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()
    );

然后使用这个类:

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

kknvjkwl2#

在一个相关的主题中,转义列名中的保留字就像在前面加上表别名一样简单。

select where from mytable

签署人:

select t.where from mytable t

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

6gpjuf90

6gpjuf903#

这个回跳的概念在Hibernate中是有效的...不幸的是,这只在你做过注解配置的情况下才有效...
您可以尝试以不同的方式(不使用注解)来完成此操作。

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

这里你需要创建一个构造函数来接受id,name,object元素&的顺序。

uubf1zoe

uubf1zoe4#

反勾号不适用于别名吗?Hibernate文档中说可以将它们用于字段。
其他问题:

  • 是否可能有其他值?
  • 为什么是Map(它也包含原始值)而不是列表?ID和名称可以从原始对象中检索。
h4cxqtbf

h4cxqtbf5#

好吧,我真的很晚在这个问题上,但由于上述解决方案不为我工作,我想我会张贴的解决方案。
我们的问题是一个名为“row”的字段。取决于xml或注解的解决方案将是:
第一个

相关问题