渴望加载一个懒惰的儿童集合

时间:2014-07-04 12:02:57

标签: java hibernate jpql

我有与此类似的数据模型

class Office
{
   @ManyToOne
   @JoinColumn(name = "cafeteria_id")
   Cafeteria cafeteria;
}

class Cafeteria
{
   @OneToMany(mappedBy="cafeteria")
   @LazyCollection(value=LazyCollectionOption.EXTRA)
   List<Chair> chairs;
}

class Chair
{
    @ManyToOne
    @JoinColumn(name = "cafeteria_id")
    Cafeteria cafeteria;
}

我有像这样的JPQL查询

select o from Office o where o.cafeteria.someThing = ?

以上查询工作正常但在一种情况下我想要一个可以急切加载所有椅子(o.cafeteria.chairs)的查询。我应该如何修改查询以急切地获取所有椅子?

2 个答案:

答案 0 :(得分:2)

fetch注释中使用OneToMany属性。您可以根据需要多次映射相同的关系:

class Cafeteria {
   @OneToMany(mappedBy="cafeteria")
   @LazyCollection(value=LazyCollectionOption.EXTRA)
   List<Chair> chairs;

   @OneToMany(fetch = FetchType.EAGER, mappedBy="cafeteria")
   List<Chair> eagerlyLoadedChairs;
}

然后你可以使用其中任何一个:

// Lazy loading
select o from Office o inner join o.cafeteria c inner join c.chairs ch where c.someThing = ?

// Eager loading
select o from Office o inner join o.cafeteria c inner join c.eagerlyLoadedChairsch where c.someThing = ?

答案 1 :(得分:1)

您有两个选项,要么将抓取类型从Lazy更改为Eager,但每次从Cafeteria加载对象时,这将始终加载Chair列表。< / p> 像这样:

@OneToMany(mappedBy="cafeteria", fetch=FetchType.EAGER)
@LazyCollection(value=LazyCollectionOption.FALSE)
List<Chair> chairs;

或者在调用此查询的Service中,在调用此查询后,只需在特定用例中加载主席列表,在Hibernate中查看有关Initializing Collections的更多信息

Hibernate.initialize(cafeteria.getChairs());