java - 左连接获取和预取

标签 java database jpa left-join

我有一个问题,当我们有像 Select DISTINCT A from A a left join fetch a.b 这样的查询时 JPA 将填充对象 A,并预取与 a 为 oneToMany 关系的对象 b。预取到底意味着什么,因为当我调试这个对象时它有空值,并且数据库中有数据,所以我假设它是一个代理对象。代理是否包含从数据库预取的任何数据,并且只有当我实际调用 a.getB().size() 这样的方法时,它才会填充到 a.b 上?

我认为如果我使用“left join fetch”我就不需要调用a.getB().size(),但是如果我不这样做,对象b将保留作为代理,然后在表示层中如果任何对象调用b的任何属性,就会有一个空指针。

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

提前感谢您的任何解释,这真的很困扰我......

最佳答案

这取决于您的 JPA 实现。

据我所知,至少对于 EclipseLink,如果您使用连接获取,该属性将始终被实例化,永远不会为 null。

关于java - 左连接获取和预取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5520778/

相关文章:

java - 如何在javax.ws.rs.client中为客户端重用java中的tcp session

MySQL 数据透视表 - 主键的存在更改查询结果

java - Hibernate @Enumerated 映射

java - 链接 Activity 会导致 OOM

java - HttpClient 4.1 并不总是返回主机值

database - 将数据库复制(克隆)到另一个编号不同的 Vertica 集群。节点数和不同的 IP 地址

php - 我无法执行我的代码,试图获取非对象的属性

java - JPA 1 个关系表,2 个独立子句,使用带有 @OneToMany 的公共(public)类

java - Spring 数据 JPA : Fetching data from entity just after save() method

java - 为什么 String.replace 不起作用?