0

我得到了这样的东西:

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 的改变,你不得不维护这种查询,所以我尽量避免这种情况。

4

2 回答 2

0

您可以更改查询以返回子记录吗?这样你就不会得到整个集合。我开始不清楚。您可以从数据库中获取子对象,然后调用 getParent() 之类的方法来获取您需要的父对象吗?

于 2013-03-09T20:58:57.937 回答
0

我不确定我是否完全理解您的要求,但我认为您正在寻找 Hibernate “额外懒惰”的集合,它允许您获取有关集合的一些信息,包括大小,而无需初始化整个集合,以及将大型集合分批加载到内存中,而不是一次全部加载。

于 2013-03-09T02:09:03.007 回答