我有与此类似的数据模型
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)的查询。我应该如何修改查询以急切地获取所有椅子?
答案 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());