2013-03-09 60 views
0

我得到了这样的事情:休眠左加入lazycollection碰不得

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()休眠触发计数...所以我总是得到整个集合(不使用)的大小。

而这几乎是它=/

更新:我得到了它通过得到的对象[]项目列表,并手动创建的类进行投影工作。 我不喜欢,因为有变化的HBM,你不得不保持这样的查询,要做到这一点,所以我尽量避免这种尽可能。

回答

0

我不知道我知道你要问什么,但我认为你正在寻找的Hibernate "extra lazy"集合,它允许你获得有关收集的一些信息,包括大小,而不初始化整个集合,并且可以批量加载大量集合到内存中,而不是一次加载到内存中。

+0

它涉及到两个diferent框架传递对象的问题,我不能没有从一个languaje到另一个发送lazycollection,重反射导致从数据库加载的一切,但我可​​以在我的例子发送代理对象,所以我我正在和他的父母建立一个儿童名单,但我甚至不能让父母离开集合......(不可触摸的)。 尝试额外的懒惰抓取,让我们看看会发生什么。 – Ziul 2013-03-09 04:22:58

0

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

+0

嗯,我认为这触发了n + 1个查询,但是,这也起作用。目前,是我知道通过实体导航的唯一途径,就是提出这个问题的原因,我不知道如何在不完全加载它们... – Ziul 2013-03-10 09:09:39

+0

这与投影的方法(这是一个不太懒集合互动可维护的代码)。 – Ziul 2013-03-10 09:16:53