【问题标题】:Hql query using dot´s in the response parameters在响应参数中使用点的 Hql 查询
【发布时间】:2014-10-01 10:34:51
【问题描述】:

我正在使用带有某些实体的 Dto 访问数据库,我想改进请求而不修改我的 dto 并删除提取,因此休眠不会返回所有实体的所有数据(休眠设置为惰性) ,我尝试了下一个,但它不起作用:

    StringBuilder hql = new StringBuilder();
    hql.append(" select d.id as id, ce.cod as clasification.cod ");
    hql.append(" from Document d");
    hql.append(" join d.clasificacionEntity ce");

工作的 hql 请求:

    StringBuilder hql = new StringBuilder();
    hql.append(" select d");
    hql.append(" from Document d");
    hql.append(" join fetch  d.clasificacionEntity ce");

问题是当我尝试使用“ce.cod as clasification.cod”时,第二个点给了我一个错误,还有其他方法吗? ,非常感谢!!!

我的 dto 结果是:

  DocumentDto{
    private id
    private clasificacionEntityDto;
  }

  And 
 clasificacionEntityDto   {
     private cod
  }   

【问题讨论】:

  • clasification.cod 是别名,为什么要在此处使用点?
  • 因为我需要这样的视图界面。
  • 什么是视图界面?您能否在问题中添加更多详细信息以避免混淆。但是仍然使用点作为别名是不正确的。
  • 还是不清楚,你想通过别名中的点来做什么? Hibernate 不允许这样做。

标签: sql spring hibernate hql dto


【解决方案1】:

当你编写这段代码时:

hql.append(" select d.id as id, ce.cod as clasification.cod ");

你告诉解析器 d.id 命名为 idce.cod 命名为 clasification.cod

最后一个别名是错误的!正确的名称是 clasificationcod

如果你想指向 ce.cod 的属性(cod 有哪些数据类型?)你可以在提取结果后指向。

【讨论】:

    【解决方案2】:

    您没有提及如何将查询结果转换为 DTO 实体。一种不需要您更改 DTO 类的简单解决方案。

    // select only the fields you need from your query
    StringBuilder hql = new StringBuilder();
    hql.append(" select d.id as id, ce.cod as cod ");
    hql.append(" from Document d");
    hql.append(" join d.clasificacionEntity ce");
    
    // ... etc. Then get back your results as raw type
    List<Object[]> rows = crit.list();
    

    然后遍历您的结果并手动创建您的 DTO。请注意,此示例假定您的文档只有一个分类。

    List<DocumentDTO> documents = new ArrayList<DocumentDTO>();
    for ( Object[] row: rows ) {
        Long id = (Long)row[0];
        String cod = (String)row[1];
        ClassificationEntityDTO ce = new ClassificationEntityDTO(cod);
        DocumentDTO d = new DocumentDTO(id, ce);
        documents.add(d);
    }
    

    看到这个问题

    AliasToBeanResultTransformer(MyDTO.class) fails to instantiate MyDTO

    【讨论】:

      【解决方案3】:

      最后我只是创建一个像这样的 dto:

      DocumentDto{
           private id
           private String clasificacionEntityDtoCod;
        }
      

      然后这样设置:

         StringBuilder hql = new StringBuilder();
         hql.append(" select d.id as id, ce.cod as clasificacionEntityDtoCod ");
         hql.append(" from Document d");
         hql.append(" join d.clasificacionEntity ce");
      

      【讨论】:

        猜你喜欢
        • 2022-09-23
        • 1970-01-01
        • 2015-02-27
        • 2015-08-26
        • 1970-01-01
        • 2016-12-13
        • 2018-06-02
        • 2011-09-16
        • 1970-01-01
        相关资源
        最近更新 更多