Hibernate中如何获取父元素的子元素?

问题描述 投票:0回答:1
@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 添加一些方法并获取所有子投资组合,或者应该从源代码完成?

enter image description here

enter image description here

如您所见,表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().....
}
spring-boot hibernate jpa spring-data-jpa hibernate-onetomany
1个回答
0
投票

您必须在“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());
}
© www.soinside.com 2019 - 2024. All rights reserved.