【发布时间】:2017-03-27 19:29:36
【问题描述】:
我正在使用 Spring Data,但我怀疑为什么即使在将外部实体声明为延迟加载之后,它们仍会急切地为此方法加载:
findByReportingManager_IdAndAndLevel(Long reporterManagerId, Integer level)
在日志中,我可以看到查询为:
select userhierar0_.id as id1_28_,
userhierar0_.LEVEL as LEVEL5_28_,
userhierar0_.REPORTING_MANAGER_ID as REPORTIN9_28_,
userhierar0_.USER_ID as USER_ID10_28_
from USER_HIERARCHY userhierar0_
left outer join
USER_V3 user1_ on userhierar0_.REPORTING_MANAGER_ID=user1_.id
where user1_.id=? and userhierar0_.CUSTOMER_ID=? and userhierar0_.LEVEL=?
即使我传递了报告经理 ID,为什么还要额外加入?
UserHierarchy 类:
@Entity
@Table(name = "USER_HIERARCHY")
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class UserHierarchy {
@Id
@GeneratedValue
private Long id;
@ManyToOne(fetch = FetchType.LAZY) // LAZY LOADING
@JoinColumn(name = "USER_ID",referencedColumnName = "ID")
private User user;
@ManyToOne(fetch = FetchType.LAZY) //LAZY LOADING
@JoinColumn(name = "REPORTING_MANAGER_ID", referencedColumnName = "ID")
private User reportingManager;
@Column(name = "LEVEL")
private Integer level;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public User getReportingManager() {
return reportingManager;
}
public void setReportingManager(User reportingManager) {
this.reportingManager = reportingManager;
}
public Integer getLevel() {
return level;
}
public void setLevel(Integer level) {
this.level = level;
}
@Override
public String toString() {
return ReflectionToStringBuilder.toStringExclude(this, "user", "reportingManager");
}
用户实体类
@Entity
@Table(name = "USER")
public class User {
@Id
@GeneratedValue
private Long id;
@Column(name = "EMAIL")
private String email;
@Column(name = "CUSTOMER_ID")
private Long customerId;
@Column(name = "STATUS")
private String status;
// Getter and Setter
根据Spring's doc:
在创建查询时,您已经确保解析的属性 是托管域类的属性。
那么这是否意味着为了使 User 对象处于“托管状态”,它使用 join 或者我在实现中错了?
【问题讨论】:
标签: mysql spring jpa spring-data spring-data-jpa