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 (只是为了破坏最后修改时间和乐观锁定版本)。