如何使用子实体检索父实体-Spring数据JPA

时间:2020-06-17 13:16:21

标签: java spring-boot spring-data-jpa

这是具有一对多关系的数据库表结构。 EMP_DETAILS和MODEL_DETAILS与action_id具有一对多关系。

下面是为子表和父表创建的实体。

EmpDetails.java

@Table(EMP_DETAILS)
@Entity
public class EmpDetails{

 @Id
 @Column(name="eid", nullable=false)
 private Integer eid;

 @OneToMany(cascade=CascadeType.ALL, mappedBy="empDetails"
 private Set<ModelDetails> modelDetailsSet;

 //other column mappings
}

ModelDetails.java

@Table(MODEL_DETAILS)
@Entity
public class ModelDetails{

  @Id
  @Column(name="id)
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  private Integer id;

  @ManyToOne(fetch=FetchType.LAZY)
  @JoinColumn(name="eid",referencedColumnName="eid", nullable=false)
  private EmpDetails empDetails;

  @Column(name="model_name")
  private String modelName;
  @Column(name="created_on")
  private Date createdOn;
  //Other column mappings and getters setters

}

以下方法确实返回了Model_Details记录。

List<ModelDetails> modelDetailList=findByModelNameOrderByCreatedOnDesc("Any_Existng_Name");

但是,当我们尝试获取与子记录相关的父记录时,我将得到null,如下所示。

modelDetailList.get(0).getEmpDetails();//THIS RETURNS NULL!

任何解决方案

1 个答案:

答案 0 :(得分:1)

@ManyToOne(fetch=FetchType.LAZY)

这就是为什么父级为null的原因。您告诉JPA您不想自动获取链接的实体。通常这是一件好事,因为您不想加载一直不需要的额外数据。

如果每次都需要EmpDetails来加载ModelDetails,则可以将其更改为@ManyToOne(fetch=FetchType.EAGER)

如果此查询只需要EmpDeatils,则需要修改find​​ByModelNameOrderByCreatedOnDesc来检索关联的实体。

您的查询应类似于SELECT md FROM ModelDetails md JOIN FETCH EmpDetails = WHERE md.name = :name ORDER BY createdOn desc