繁体   English   中英

左联接获取和预取

[英]Left join fetch and prefetching

我有一个问题,当我们从A中选择Select DISTINCT A之类的查询时,左连接获取ab JPA将带来对象A的填充,并且对象b与a的oneToMany关系将被预取。 确切的说是预取,因为当我调试该对象时,它具有空值,并且数据库中有数据,因此我假设它是一个代理对象。 代理是否包含从数据库中预取的任何数据,并且仅在我实际调用a.getB()。size()之类的方法时才填充在ab上?

我以为如果使用“左连接提取”,则不需要调用a.getB()。size(),但是如果我不这样做,则对象b将保留为代理,然后在在表示层中,如果任何对象调用b的任何属性,则存在一个nullpointer。

我可能还要补充一点,即此b对象被映射为延迟加载,这就是为什么我毕竟使用fetch的原因。 :)另外,即使我使用“左连接提取”并调用a.getB()。size(),也不会进行任何附加查询吗? 预取将负责获取b的所有数据,...它只需要我调用一个方法,以便它将数据从代理传输到实际对象?

在此先感谢您的解释,这真的让我感到困扰。

这取决于您的JPA实施。

据我所知,至少使用EclipseLink,如果使用联接提取,则该属性将始终被实例化,绝不会为null。

这可能是DISTINCT子句的问题,因为这里您具有A-> B之类的映射,所以在结果集中,您可能会有多个A代表B。使用Set集合填充数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM