当前位置: 首页 > 面试题库 >

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

华佐
2023-03-14
问题内容

我用下面的查询来获得java.util.Map与指数idtext以及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]

问题答案:

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

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


 类似资料:
  • 问题内容: 我正在尝试对多个不同的数据库使用一种Hibernate映射:H2,Oracle,MySql。 每个数据库都有一个不同的保留字列表。 我希望Hibernate自动转义保留字。 我知道我可以: 使用反引号强制转义(为了安全起见,请逃避一切) 更改所有标识符,使它们在任何数据库中都肯定不是关键字(使它们难看) 将模式绑定到一组特定的数据库,转义关键字的并集(如果将新数据库添加到组合中,则会中

  • 问题内容: 我似乎在Hibernate中映射列表时遇到问题。在我们的项目中有一类用含有类与含有。 Hibernate 是否可以使用注释进行映射?我的意思是,因为它没有注释? 问候 问题答案: 用途: 资料来源: 7.2.3。基本类型和可嵌入对象的集合

  • 代码如下: 运行时,会出现错误 原因:org。冬眠QueryParameterException:位置超出已声明序数参数的数量。请记住,序数参数是基于1的!职位:1 被抛出,我知道这是由sql字符串中的'--'引起的,hibernate将其解释为sql注释, 我试着用 这可以成功运行,但是输出变成\-\-,但是我想要的是——在输出中。 那么如何在hibernate中转义--? 如果我运行selec

  • 问题内容: 我正在使用和。我以前在sql中使用过正则表达式,现在是我第一次在HQL中使用它。 这是我的hql,当我不带功能运行它时,它按预期运行。但是我不能用表达式执行它。 它说.. 嵌套的异常是org.hibernate.hql.ast.QuerySyntaxException:意外的AST节点:(靠近第1行,第66列..... 请帮助,如何在hibernate本机查询中使用?或其他替代方法。

  • 我正在使用oracle 10g和hibernate 3.3.2。我以前在sql中使用过正则表达式,现在我第一次在HQL中使用它。 这是我的hql,当我在没有类似regex_的函数的情况下运行它时,它会按预期运行。但我无法用类似正则表达式的表达式执行它。 它说... 嵌套异常是org.hibernate.hql.ast.QuerySynTaxException:意外的AST节点:(靠近第1行,第66

  • 我想使用hibernate对距离进行排序,但“st_distance”不起作用。日志: ----org.hibernate.queryexception:node:org.hibernate.hql.internal.ast.tree.methodnode-[METHOD_CALL]methodnode:'('+-[METHOD_NAME]identnode:'st_distance‘{Origi