hibernate左连接lazycollection不可触及

时间:2013-03-09 01:50:53

标签: java hibernate

我有这样的事情:

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

2 个答案:

答案 0 :(得分:0)

我不确定我是否完全理解您的要求,但我认为您正在寻找Hibernate "extra lazy"集合,这些集合可让您获取有关集合的一些信息,包括大小,不初始化整个集合,以及批量加载大型集合,而不是一次性加载。

答案 1 :(得分:0)

您可以更改查询以返回子记录吗?这样你就不会得到整个系列。我不清楚。你能从数据库中获取子对象,然后调用类似getParent()的东西来获得你需要的父级吗?