【问题标题】:In Spring Data how to read entity by foreign key value instead of join?在 Spring Data 中,如何通过外键值而不是连接来读取实体?
【发布时间】: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


    【解决方案1】:

    我最近偶然发现了同样的问题,目前在 Spring Data 中似乎没有解决方案。

    但是我已经为它创建了一个ticket

    如果您为此特定查询使用 Criteria API 或 JPQL,那么它将正常工作。

    【讨论】:

    • 您是否知道此功能是否在最新版本的 Spring Data JPa 中实现?
    猜你喜欢
    • 2021-01-05
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    相关资源
    最近更新 更多