在响应参数中使用dot的Hql查询

时间:2014-10-01 10:34:52

标签: sql spring hibernate hql dto

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

    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”时,第二个点给我一个错误,还有其他方法可以做到这一点吗? ,非常感谢!!!

我的结果是:

  DocumentDto{
    private id
    private clasificacionEntityDto;
  }

  And 
 clasificacionEntityDto   {
     private cod
  }   

3 个答案:

答案 0 :(得分:1)

编写此代码时:

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

您告诉名为d.id的解析器id和名为ce.cod的{​​{1}}

最后的别名错了!正确的名称是clasification.codclasification

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

答案 1 :(得分:1)

您没有提到如何将查询结果转换为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

答案 2 :(得分:0)

最后我只想创建一个这样的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");