我得到了这样的东西:
Criteria crit = session.createCriteria(Parent.class,"p");
parentsList = crit.createCriteria(
"childSet","c",
JoinType.LEFT_OUTER_JOIN,
Restrictions.eq("jt.2ndParentDto.pk2ndParentDto", pk2ndParent))
.list();
我的查询返回一个有一个孩子或没有孩子的父母列表,我已经直接测试了记录的查询,所以我很确定。
我必须检索一个孩子列表,所以我添加了父母并创建了缺失的孩子。
List<ChildDto> list=new ArrayList<ChildDto>();
for(ParentDto item:parentsList){
Iterator<ChildDto> it=item.getChildSet().iterator();
if(it.hasNext()){
ChildDto dto = it.next();
dto.setParentDto(item);
list.add(dto);
}
else{
ChildDto dto = new ChildDto();
dto.setParentDto(item);
list.add(dto);
}
}
return list;
通过调用item.getChildSet().iterator()
休眠加载整个集合,所以我不能调用item.getChildSet().iterator().hasNext
来检查集合中是否有东西,我也不能item.getChildSet().size()
因为完全相同的原因调用...
那怎么办?,还有什么?,我目前没有想法,如果有一套,我怎么能得到唯一的项目?
更新:我刚刚尝试了额外的延迟加载,但它并没有改变更好或更坏......
item.getChildSet().iterator()
仍然会导致加载整个集合。
当我做item.getChildSet().size()
休眠触发计数时......所以我总是得到整个集合的大小(没用)。
差不多就是这样=/
更新:我通过获取 Object[] 项目列表并手动创建类来使用投影。我不喜欢这样做,因为随着 Hbm 的改变,你不得不维护这种查询,所以我尽量避免这种情况。