投影不会懒散地加载ManyToOne关系



我有一个表示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;

这样,你就可以把它作为投影的一部分。

最新更新