私はこのようなものを得ました:
Criteria crit = session.createCriteria(Parent.class,"p");
parentsList = crit.createCriteria(
"childSet","c",
JoinType.LEFT_OUTER_JOIN,
Restrictions.eq("jt.2ndParentDto.pk2ndParentDto", pk2ndParent))
.list();
私のクエリは、それぞれに1つの子を持つ親のリストを返すか、まったく子を持たない親のリストを返します。ログに記録されたクエリを直接テストしたので、かなり確信しています。
子のリストを取得する必要があるため、親を追加して不足している子を作成しています。
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()
、まったく同じ理由でどちらも呼び出すことができません...
では、他に何がありますか?、現在アイデアがありません。セットの唯一のアイテムがある場合、どうすれば入手できますか?
更新:Extra lazy loadingを試しましたが、良くも悪くも変わりません...
item.getChildSet().iterator()
コレクション全体をロードします。
そして、item.getChildSet().size()
休止状態にするとカウントがトリガーされます...そのため、常にコレクション全体のサイズを取得します(使用しません)。
そして、それはほとんどそれです=/
更新: Object[] アイテムのリストを取得し、クラスを手動で作成することにより、プロジェクションで動作するようになりました。Hbm を変更すると、この種のクエリを維持する必要があるため、これを行うのは好きではありません。