@Entity
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Portfolio {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "name")
private String name;
@OneToMany(mappedBy="child", fetch = FetchType.EAGER)
private List<PortfolioChildMap> portfolioChildMap;
}
@Entity
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PortfolioChildMap {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@ManyToOne
@JoinColumn(name = "parent_id")
private Portfolio parent;
@ManyToOne
@JoinColumn(name = "child_id")
private Portfolio child;
}
@Repository
public interface PortfolioChildMapRepository extends JpaRepository<PortfolioChildMap, Integer> {}
@Repository
public interface PortfolioRepository extends JpaRepository<Portfolio, Integer> {}
@SpringBootApplication
public class HibernateApplication {
public static void main(String[] args) {
SpringApplication.run(HibernateApplication.class, args);
}
@Bean
CommandLineRunner commandLineRunner(PortfolioRepository portfolioRepository,
PortfolioChildMapRepository portfolioChildMapRepository){
return args -> {
Portfolio parent = Portfolio.builder().name("Portfolio").build();
portfolioRepository.save(parent);
Portfolio childrenA = Portfolio.builder().name("Children_A").build();
portfolioRepository.save(childrenA);
Portfolio childrenB = Portfolio.builder().name("Children_B").build();
portfolioRepository.save(childrenB);
portfolioChildMapRepository.save(PortfolioChildMap.builder().parent(parent).child(childrenA).build());
portfolioChildMapRepository.save(PortfolioChildMap.builder().parent(parent).child(childrenB).build());
};
}
}
我想为每个家长的作品集获得一个儿童的作品集。实现这一点的最佳方法是什么?是否可以向 PortfolioRepository 添加一些方法并获取所有子投资组合,或者应该从源代码完成?
如您所见,表PortfolioChildMap包含两列parent_id和child_id。 我想获取父作品集的作品集列表。是否可以在 PortfolioRepository 端实现此功能?我想调用一些方法并获取包含或不包含子投资组合的列表,或者以某种方式使用 Stream API 获取子投资组合
@Repository
public interface PortfolioRepository extends JpaRepository<Portfolio, Integer> {
List<Portfolio> some_method_here(parent id);
}
或使用 Stream API 但坦率地说我不知道该怎么做
Optional<Portfolio> portfolioOptional = portfolioRepository.findById(1);
if(portfolioOptional.isPresent()){
Portfolio portfolio = portfolioOptional.get();
List<Portfolio> childrenPortfolio = portfolio.getPortfolioChildMap().....
}
您必须在“Portfolio”和“PortfolioChildMap”之间建立双向关系,通过替换更新“Portfolio”实体:
@OneToMany(mappedBy = "child", fetch = FetchType.EAGER)
与:
@OneToMany(mappedBy = "parent", fetch = FetchType.EAGER)
或者,您可以像这样实现 JPA 查询:
@Repository
public interface PortfolioRepository extends JpaRepository<Portfolio, Integer> {
@Query("SELECT pc.child FROM PortfolioChildMap pc WHERE pc.parent.id = :parentId")
List<Portfolio> findChildrenByParentId(@Param("parentId") Integer parentId);
}
然后在你的服务类中你可以调用该方法:
Optional<Portfolio> portfolioOptional = portfolioRepository.findById(parentId);
if (portfolioOptional.isPresent()) {
Portfolio parent = portfolioOptional.get();
List<Portfolio> childrenPortfolios = portfolioRepository.findChildrenByParentId(portfolioOptional.getId());
}