我有一个表示MySQL表的实体:
@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()
投影方法,但没有成功。
因此,我无法仅检索GroupEntity 的某些列
当然有,只需使用嵌套投影:
public interface AccountProjection {
Long getId();
String getName();
... // other columns
}
public interface GroupBaseProjection {
UUID getGroupId();
AccountProjection getOwnerAccount();
}
有没有一种方法可以让投影惰性地加载@ManyToOne关系?
我不这么认为,因为投影不是实体,因此它们不由JPA管理。
EDIT看起来嵌套投影无论如何都会选择所有实体属性(请参见注释(。作为一种变通方法,如果您只对id感兴趣,可以尝试将联接列再次映射为一个简单的属性:
@Column(name = "owner_account_id", insertable = false, updatable = false)
private Long ownerAccountId;
这样,你就可以把它作为投影的一部分。