所以我在这个问题上停留了大约半天,所以我想知道我是否只是使事情变得过于复杂。
我的应用程序具有三种不同的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);
}
答案 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 :(得分: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;
}