Java 如何在Hibernate';s HQL
我使用以下查询来获取一个Java 如何在Hibernate';s HQL,java,hibernate,hql,Java,Hibernate,Hql,我使用以下查询来获取一个java.util.Map,其中包含索引id、text和对象: 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中转义别名的方法
java.util.Map
,其中包含索引id
、text
和对象
:
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使用backtick转义的方法是什么
使用backtick会出现以下错误:
Exception in thread "main" org.hibernate.QueryException: unexpected char:
'`' [SELECT u.id AS id, u.name AS text, u AS `object` FROM User u]
反勾号对别名不起作用吗? 他们说把它们用于字段 其他问题:
- 另一个值是否可能
- 为什么是地图(它也包含原始值)而不是列表? 可以从原始对象检索Id和名称
- 背部tics概念在hibernate中有效。。不幸的是,这只有在您完成了注释配置后才有效
您可以尝试以不同的方式(不带注释)执行此操作
在这里,您需要创建一个正在使用的构造函数,该构造函数接受id、名称、对象元素&按此顺序。您可以通过使用自定义的“alias to 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);
}
}
}
公共类别名变压器扩展基本TransformerAdapter{
私有地图重命名IASMAP;
公共别名变压器(映射重命名IASMAP){
this.renameAliasMap=(renameAliasMap==null)?Collections.emptyMap():renameAliasMap;
}
@凌驾
公共对象转换元组(对象[]元组,字符串[]别名){
映射结果=新的HashMap(tuple.length);
for(int i=0;i
在相关主题中,转义列名中的保留字与使用表别名作为前缀一样简单。无背景标记、方括号等。只需更换
select where from mytable
作者:
(注意:我并不是说把“where”作为列名是个好主意;-)我试过ofc。它们在查询中似乎不起作用。我想使用map,因为它非常灵活,并且数据被提供给其他API。Backtics也可以在XML映射文件中使用。但我想逃避HQL中的事情。别名的主要特点是可以任意指定别名。我使用
Map
作为系统解耦部分之间的最低公分母。如果他们能工作的话,这真的很方便。谢谢,这是目前为止最好的解决方案。这只适用于以非常具体的方式选择的名称。如果您想处理写在“where”子句或其他地方的关键字,该怎么办?
select where from mytable
select t.where from mytable t