在弹簧数据JPA中获取带有过滤儿童的父母实体列表



,所以我一直在这个问题上呆了大约半天,所以我想知道我是否只是过分简单的事情。

我的应用程序有三个不同的Java对象类:祖父母,父母和孩子。每个祖父母都包含父母的名单,每个父母都包含一个孩子列表。儿童拥有" Iswellbehavhav"的财产,这是布尔人。

我们正在使用弹簧数据JPA和Hibernate,以将数据映射到数据库。我们的应用程序包含许多嵌套实体和循环关系,我们依靠预测来减少请求规模。

问题:给定祖父母ID,我想返回所有父母的列表(作为预测(。我希望每个父母都包含一个儿童预测列表,但前提是孩子表现得很好。收藏中的其余孩子应从集合中滤出。

实现这一目标的最简单方法是什么?目前,我们不使用 Hibernate Filters ,我并不热衷于引入它们,因为我们不太可能在其他任何地方都需要它们(无论哪种方式,它都适合此目的吗?(。我已经使用了 JPA标准API Predicates (很少(,但发现很难适应这种特定情况。本地查询要走的方式吗?我已经开始朝这个方向发展,但是由于所有嵌套的依赖关系,遇到了一些问题,将所有字段映射到我们的春季实体,因此只想确保我什至在继续之前朝着正确的方向前进。

我(简化的(父级实体类看起来像:

@Entity
@Table(name="parent"
public class Parent {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="parent_id")
    Integer id;
    Integer grandparentId; 
    @OneToMany(mappedBy = "parent")
    List<Child> children;
}

儿童课:

@Entity
@Table(name="child"
public class Child {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="child_id")
    Integer id;
    @ManyToOne
    @JoinColumn(name="parent_id")
    Parent parent;
    boolean isWellBehaved; 
}

父存储库接口:

@RepositoryRestResource(excerptProjection = ParentProjection.class)
public interface ParentRepository extends JpaProjectionRepository<Parent, Integer, ParentProjection> {
    List<ParentProjection> findAllByGrandparent_Id(Integer grandpaId);
}

您可以在集合上使用 @Where Hibernate的注释。它会像

@Entity
@Table(name="parent"
public class Parent {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="parent_id")
    Integer id;
    Integer grandparentId; 
    @Where(clause = "isWellBehaved=true")
    @OneToMany(mappedBy = "parent")
    List<Children> children;
}

正如您所说的:

我希望每个父母都包含一个孩子的预测列表,但前提是孩子表现良好。

List<childerns>allChilderns=parentsList.stream().map(parent>dao.findchildernByParentId()).collect(Collectors.List());
allChilderns.stream().filter(childern->childern.isWellBehaved()==true).collect(Collectors.toList());
  1. 让祖父母的所有父母 - 您正在做的那个。
  2. 一旦您得到了所有父母,每个父母findchildernbyparentid。
  3. 然后根据条件过滤掉childern。

让我知道:(

最新更新