我有这样的事情:
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()
hibernate会加载整个集合,因此我无法调用item.getChildSet().iterator().hasNext
来检查集合中是否存在某些内容,并且由于完全相同的原因我无法调用item.getChildSet().size()
。 ..
更新:我只是尝试了额外的延迟加载,但它不会改变为好或坏......
item.getChildSet().iterator()
仍会导致加载整个集合。
当我做item.getChildSet().size()
hibernate触发计数时...所以我总是得到整个集合的大小(没用)。
这就是它/ =
更新:我通过获取Object []项列表并手动创建类来实现投影。 我不喜欢这样做,因为随着对Hbm的改变,你被迫维持这种查询,所以我尽量避免这种情况。
答案 0 :(得分:0)
我不确定我是否完全理解您的要求,但我认为您正在寻找Hibernate "extra lazy"集合,这些集合可让您获取有关集合的一些信息,包括大小,不初始化整个集合,以及批量加载大型集合,而不是一次性加载。
答案 1 :(得分:0)
您可以更改查询以返回子记录吗?这样你就不会得到整个系列。我不清楚。你能从数据库中获取子对象,然后调用类似getParent()的东西来获得你需要的父级吗?