在Spring Data JPA中获取具有子级筛选集合的父级实体列表

时间:2019-06-27 20:59:26

标签: java spring hibernate spring-data-jpa projection

所以我在这个问题上停留了大约半天,所以我想知道我是否只是使事情变得过于复杂。

我的应用程序具有三种不同的Java对象类:祖父母,父母和孩子。每个祖父母都包含父母名单,每个父母都包含孩子名单。子级具有“ isWellBehaved”属性,该属性是布尔值。

我们正在使用Spring Data JPA和Hibernate来将数据映射到数据库。我们的应用程序包含许多嵌套实体和循环关系,并且我们依靠投影来减小请求大小。

问题:给定祖父母的ID,我想返回所有父级的列表(作为投影)。我希望每个父项都包含一个子项投影列表,但前提是该子项行为良好。集合中的其余孩子应从集合中过滤掉。

最简单的方法是什么?目前,我们没有使用休眠过滤器,而且我也不希望引入它们,因为我们不太可能在其他任何地方使用它们(无论哪种方式,都适合于此目的吗?)。我使用了 JPA Criteria API谓词(很少),但发现很难使其适应这种特殊情况。 本地查询是可行的方式吗?我已经开始朝着这个方向前进,但是由于所有嵌套的依赖关系,在将所有字段映射到我们的Spring实体时遇到了一些问题,所以只想确保在继续之前我朝着正确的方向前进。

我的(简化的)父实体类如下:

@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);
}

2 个答案:

答案 0 :(得分:0)

如您所说:

  

我希望每个父项都包含一个子项投影列表,但前提是该子项表现良好。

List<childerns>allChilderns=parentsList.stream().map(parent>dao.findchildernByParentId()).collect(Collectors.List());

allChilderns.stream().filter(childern->childern.isWellBehaved()==true).collect(Collectors.toList());
  1. 通过GrandParentId(您正在做的那一个)获取所有父母。
  2. 一旦有了所有的父母,对于每个父母,就会找到childchildernByParentId。
  3. 然后根据条件过滤出孩子。

让我知道:)

答案 1 :(得分:0)

您可以在集合上使用@Where注释来休眠。就像

@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;
}