如何使用JPARepository仅返回目标实体

时间:2019-07-26 02:31:16

标签: hibernate jpa

我有多个这样设置的父子实体。

public class Brigade {
  // Ids

  @OneToMany(mappedBy = "brigade", orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
  @JsonManagedReference
  private List<Battalion> battalionList;

 // other columns
}

public class Battalion {
  // Ids

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "BRIGADE_ID")
  @JsonBackReference
  private Brigade brigade;

  @OneToMany(mappedBy = "battalion", orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
  @JsonManagedReference
  private List<Company> companyList;

  // other columns
}

public class Company {
  // Ids

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "BATTALION_ID")
  @JsonBackReference
  private Battalion battalion;

  // other columns
}

在前端,我有一个页面来显示一个营表,供用户选择以查看详细信息。该页面依赖于RESTful API,并按此设置了存储库和服务类。

public interface BattalionRepository extends JpaRepository<Battalion, Long> { }

public class BattalionService {

  @Autowired
  private BattalionRepository battRepository;

  public List<Battalion> getAllBattalions() {
    return List<Battalion> battRepository.findAll();
  }

  // other stuff
}

我的问题是,JPARepository的.findAll()方法将不仅返回该营条目的列表,而且还返回该营链接到的上级旅实体,以及每个营包含的所有关联子公司。它使JSON数据膨胀(我不需要表的所有这些详细信息),并且在调试时很难读取,更不用说仅将所有数据转储到客户端的安全性问题了。

如何获取JPARepository以返回 just 目标实体?

1 个答案:

答案 0 :(得分:2)

通过使用Projections,您可以通过声明代表选择属性的自己的接口并编写自己的查询方法来获取选择属性。当然,有多种编写接口的方法。看一下文档中共享的示例。

相关问题