我想在某些用例中急切地获取一对多List
- s(但并非总是如此,因此@OneToMany(fetch=FetchType.EAGER)
不会很好),而且我也想要JPA使用单独的SQL选择来获取那些List
- s(每List
一个选择,而不是每个List
项一个),而不是SQL连接。那是因为笛卡儿的产品(我有两个独立的清单)。
您可能认为我可以使用JPA 2.1实体图表(毕竟它是什么,将标记属性视为特定方式)或不太优雅left join fetch
使用JPQL(或使用标准API)。但是这些似乎坚持使用SQL连接(在left join fetch
的情况下并不奇怪),即使这样他们最终得到MultipleBagFetchException
,他们也不会退回到获取一些List
- s在单独的SQL选择中。实际上我的案例也是一个多包箱,但在你重定向我用Set
- s等工作之前,请注意前提是我不想加入(太大的笛卡儿)产品)。现在,只是为了取笑我,如果我使用List
注释@OneToMany(fetch=FetchType.EAGER)
属性,Hibernate会足够智能地在单独的选择中获取List
- s以避免多个包(加上我甚至可以使用Hibernate的Fetch
注释强制执行此行为。因此,似乎JPA 2.1实体图未能实现ad-hoc FetchType.EAGER
的承诺,因为它们的行为与ad-hoc fetch join相似,我们之前已经有过它们。或者我错过了什么?
我突然想到,我应该在初始查询后调用parentEntity.getSomeList().size()
,这次不会尝试获取列表,但问题是,我还需要急切地获取一些属性。列出项目本身,我无法为上述调用指定实体图表。我也可以自己创建一个JPA查询,它只能获得" someList"用急切的提取(没问题),但是如何将结果列表放回parentEntity
?如果我调用parentEntity.setSomeList(fetchedList)
,parentEntity
变脏(尽管它不在关联的所有者一侧),所以它将是SQL update-d(仅限破坏最后一次修改)时间和乐观锁定版本。)
答案 0 :(得分:0)
另一种方法是将同一个表映射到两个不同的实体中。因此,当您需要具有多个选择的EAGER行为时,您可以将实体用于:
Run command: ./hello-world
Child pid: 53209
Run command: ./hello-world
Child pid: 53210
...
当你想要懒惰时,你可以使用另一个实体:
@Fetch(FetchMode.SELECT)
@ManyToOne(fetch = FetchType.EAGER)