如何在Hibernate的HQL中转义保留字 [英] How to escape reserved words in Hibernate's HQL

查看:511
本文介绍了如何在Hibernate的HQL中转义保留字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用以下查询来获取带有索引 id ,<$ c $的 java.util.Map c> 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 是可以的。什么是当前在HQL中使用反引号转义的方式来在HQL中转义别名

使用反向提供以下错误:

 线程main中的异常org.hibernate.QueryException:意外的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 {
$ b $ private Map< String,String> renameAliasMap;


public AliasToMapTransformer(Map< String,String> renameAliasMap){
this.renameAliasMap =(renameAliasMap == null)? < String,String> emptyMap():renameAliasMap;


$ b @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]);
}
}
返回结果;


$ b public static Builder renameAlias(String alias,String newAlias){
return new Builder()。renameAlias(alias,newAlias);
}


public static class Builder {
$ b $ private Map< String,String> aliasConversionMap = new HashMap< String,String>();


public Builder renameAlias(String alias,String newAlias){
aliasConversionMap.put(alias,newAlias);
返回此;
}


public AliasToMapTransformer build(){
返回新的AliasToMapTransformer(aliasConversionMap);
}
}
}


I use the following query to get a java.util.Map with indexes id, text and 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);

... but object seems to be a reserved word. For example obj is OK. What is the current way to escape an alias in HQL the way MySQL uses backtick escapes?

Using backtick gives the following error:

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

解决方案

You could achieve it by a workaround using your custom "alias to map" transformer, so your code would change to something like this

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

And then using this class:

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的HQL中转义保留字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆