gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:42:24 27 4
gpt4 key购买 nike

我使用下面的查询来获取一个 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 中转义 别名 的方式是什么,就像 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]

最佳答案

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

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

关于java - 如何转义 Hibernate 的 HQL 中的保留字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5686412/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com