Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Hibernate';s HQL_Java_Hibernate_Hql - Fatal编程技术网

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