投影不会延迟加载 ManyToOne 关系
Projections do not load ManyToOne relations lazily
我有一个代表 MySQL table:
的实体
@Entity
@Table(name = "group_")
@Getter
@Setter
@SuppressWarnings("serial")
public class GroupEntity
implements Serializable {
@Id
@GeneratedValue(generator = "uuid2")
@Column(name = "group_id")
private UUID groupId;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "owner_account_id")
@NotNull
private AccountEntity ownerAccount;
@Column(name = "value")
@NotBlank
private String value;
}
还有一个投影:
public interface GroupBaseProjection {
UUID getGroupId();
AccountEntity getOwnerAccount();
}
这是我的存储库:
public interface GroupsRepository extends JpaRepository<GroupEntity, UUID> {
GroupBaseProjection findBaseByGroupId(UUID groupId);
}
当我检索实体时,ownerAccount
是延迟加载的(Hibernate MySQL 查询只选择它的 ID)但是当我检索投影时,它是急切加载的(Hibernate MySQL 查询对所有 AccountEntity
列进行内部连接)。所以我无法只检索 GroupEntity
的某些列(我必须使用实体检索所有列,或者使用投影检索其中一些加上 AccountEntity
的所有列)。
有没有办法让投影延迟加载 @ManyToOne
关系?我试过用 @ManyToOne(fetch = FetchType.LAZY, optional = false)
和 @LazyToOne(LazyToOneOption.PROXY)
注释 getOwnerAccount()
投影方法,但它没有用。
So there is no way I can retrieve only some columns of the GroupEntity
当然有,只是使用嵌套投影:
public interface AccountProjection {
Long getId();
String getName();
... // other columns
}
public interface GroupBaseProjection {
UUID getGroupId();
AccountProjection getOwnerAccount();
}
Is there a way I can get the projection to load the @ManyToOne relation lazily?
我不这么认为,因为投影不是实体,因此它们不受 JPA 管理。
编辑看起来嵌套投影 select 所有实体属性(见评论)。作为解决方法,如果您只对 id 感兴趣,您可以尝试再次将连接列映射为简单的 属性:
@Column(name = "owner_account_id", insertable = false, updatable = false)
private Long ownerAccountId;
通过这种方式,您将能够使其成为投影的一部分。
我有一个代表 MySQL table:
的实体@Entity
@Table(name = "group_")
@Getter
@Setter
@SuppressWarnings("serial")
public class GroupEntity
implements Serializable {
@Id
@GeneratedValue(generator = "uuid2")
@Column(name = "group_id")
private UUID groupId;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "owner_account_id")
@NotNull
private AccountEntity ownerAccount;
@Column(name = "value")
@NotBlank
private String value;
}
还有一个投影:
public interface GroupBaseProjection {
UUID getGroupId();
AccountEntity getOwnerAccount();
}
这是我的存储库:
public interface GroupsRepository extends JpaRepository<GroupEntity, UUID> {
GroupBaseProjection findBaseByGroupId(UUID groupId);
}
当我检索实体时,ownerAccount
是延迟加载的(Hibernate MySQL 查询只选择它的 ID)但是当我检索投影时,它是急切加载的(Hibernate MySQL 查询对所有 AccountEntity
列进行内部连接)。所以我无法只检索 GroupEntity
的某些列(我必须使用实体检索所有列,或者使用投影检索其中一些加上 AccountEntity
的所有列)。
有没有办法让投影延迟加载 @ManyToOne
关系?我试过用 @ManyToOne(fetch = FetchType.LAZY, optional = false)
和 @LazyToOne(LazyToOneOption.PROXY)
注释 getOwnerAccount()
投影方法,但它没有用。
So there is no way I can retrieve only some columns of the GroupEntity
当然有,只是使用嵌套投影:
public interface AccountProjection {
Long getId();
String getName();
... // other columns
}
public interface GroupBaseProjection {
UUID getGroupId();
AccountProjection getOwnerAccount();
}
Is there a way I can get the projection to load the @ManyToOne relation lazily?
我不这么认为,因为投影不是实体,因此它们不受 JPA 管理。
编辑看起来嵌套投影 select 所有实体属性(见评论)。作为解决方法,如果您只对 id 感兴趣,您可以尝试再次将连接列映射为简单的 属性:
@Column(name = "owner_account_id", insertable = false, updatable = false)
private Long ownerAccountId;
通过这种方式,您将能够使其成为投影的一部分。