2

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),即使它们最终以 a 结尾MultipleBagFetchException,它们也不会退回到List在单独的 SQL 选择中获取一些 -s 。实际上我的案例也是一个多袋案例,但是在您将我重定向到使用Set-s 等解决它之前,请注意前提是我不想要加入(太大的笛卡尔积)。现在,逗我一下,如果我用 注释List属性@OneToMany(fetch=FetchType.EAGER),Hibernate 将足够聪明地获取List-s 在单独的选择中避免多个包(另外我什至可以使用 Hibernate 的Fetch注释强制执行此行为)。因此,JPA 2.1 实体图似乎无法兑现 ad-hoc 的承诺FetchType.EAGER,因为它们的行为很像 ad-hoc fetch 连接,我们之前也已经有了。还是我错过了什么?

我突然想到,我应该parentEntity.getSomeList().size()在初始查询之后调用,这次不会尝试急切获取列表,但问题是,我还需要急切获取列表项本身的一些属性,我无法指定上述调用的实体图。我也可以自己创建一个 JPA 查询,它只能通过所述急切获取获得“someList”(这些都没有问题),但是我怎样才能将结果列表放回parentEntity?如果我调用parentEntity.setSomeList(fetchedList),parentEntity就会变脏(尽管它不在关联的所有者端),所以它将是 SQL update-d (只是为了破坏最后修改时间和乐观锁定版本)。

4

1 回答 1

0

另一种方法是将同一张表映射到两个不同的实体中。因此,当您需要多个选择的 EAGER 行为时,您可以将实体与:

@Fetch(FetchMode.SELECT)
@ManyToOne(fetch = FetchType.EAGER)

当你想要懒惰时,你可以使用另一个实体:

@Fetch(FetchMode.SELECT)
@ManyToOne(fetch = FetchType.LAZY)
于 2017-01-05T01:10:32.413 回答