急切地加载一个懒惰的子集合 [英] Eager loading a lazy child collection

查看:86
本文介绍了急切地加载一个懒惰的子集合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有类似于此的数据模型

  class Office 
{
@ManyToOne
@JoinColumn(name =cafeteria_id)
自助餐厅自助餐厅;
}

class Cafeteria
{
@OneToMany(mappedBy =cafeteria)
@LazyCollection(value = LazyCollectionOption.EXTRA)
列表与LT椅子>椅子;
}

类椅子
{
@ManyToOne
@JoinColumn(name =cafeteria_id)
自助餐厅自助餐厅;
}

我有这样的JPQL查询

 从办公室o选择o o.cafeteria.someThing =? 

上面的查询可以正常工作,但在一种情况下,我希望能够加载所有椅子的查询o.cafeteria.chairs)。我应该如何修改查询以热切地获取所有椅子?使用 fetch 使用解决方案>属性在 OneToMany 注释中。您可以根据需要多次映射相同的关系:

  class Cafeteria {
@OneToMany(mappedBy =食堂)
@LazyCollection(value = LazyCollectionOption.EXTRA)
List< Chair>椅子;

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

然后您可以使用它们中的任何一个:

  //延迟加载
从Office中选择o内部加入o.cafeteria c内部加入c.chairs ch其中c.someThing =?

// Eager加载
从Office中选择o内部加入o.cafeteria c内部加入c.eagerlyLoadedChairsch其中c.someThing =?


I have data model similar to this

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;
}

I have a JPQL query like this

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

Above query works fine but in one case I would like a query which could eagerly load all the chairs(o.cafeteria.chairs) as well. How should I modify query to eagerly fetch all chairs?

解决方案

Use fetch attribute in OneToMany annotation. You can map the same relationship as many times as you want:

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

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

And then you can use any of them:

// 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 = ?

这篇关于急切地加载一个懒惰的子集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆