我正在使用带有一些实体的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
}
答案 0 :(得分:1)
编写此代码时:
hql.append(" select d.id as id, ce.cod as clasification.cod ");
您告诉名为d.id
的解析器id
和名为ce.cod
的{{1}}
最后的别名错了!正确的名称是clasification.cod
或clasification
。
如果你想指向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");