如何在 Hibernate 的 HQL 中转义保留字 [英] How to escape reserved words in Hibernate's HQL
本文介绍了如何在 Hibernate 的 HQL 中转义保留字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我使用以下查询来获取带有索引 id
、text
和 object
的 java.util.Map
>:
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);
...但是 object
似乎是一个保留字.例如 obj
就可以了.当前在 HQL 中转义 alias 的方法是什么,就像 MySQL 使用反引号转义一样?
... 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()
);
然后使用这个类:
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屋!
查看全文