[英]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.