我有一个问题,当我们有来自A的选择DISTINCT A之类的查询时左边的连接获取a.b JPA将填充对象A,并且将预取与a的oneToMany关系的对象b。究竟是什么意思被预取,因为当我调试这个对象时它有空值,并且数据库中有数据,所以我假设它是一个代理对象。代理是否包含从数据库中预取的任何数据,当我实际调用类似a.getB()。size()的方法时,它只会在a.b上填充?
我认为如果我使用“左连接提取”我不需要调用a.getB()。size(),但如果我不这样做,对象b将保留为代理,然后在表示层中,如果任何对象调用b的任何属性,则有一个nullpointer。
我可能还会添加这个b对象被映射为延迟加载,这就是为什么我使用fetch afterall。 :)此外,即使我使用“左连接提取”并调用a.getB()。size(),它也不会做任何aditional查询吗?预取将负责获取所有b的数据,...它只需要我调用一个方法,以便将数据从代理传输到实际对象?
提前感谢任何解释,这真的很困扰我......
答案 0 :(得分:1)
这取决于您的JPA实施。
据我所知,至少使用EclipseLink,如果使用连接提取,该属性将始终被实例化,永远不会为空。
答案 1 :(得分:0)
这可能是DISTINCT子句的问题,因为这里你有像A-> B的映射,所以在结果集中你可能有多个A的结果用于B.使用Set集合来填充数据。