java - JPA 与规范 - 如何通过子集合内容过滤实体?

标签 java jpa filter specifications

我面临着通过列表中子项的值过滤实体的问题。 例如:

public class Father(){
  private String name;
  private Set<Child> childs;
}
public class Child(){
  private String name;
  private Integer age;
  private School school;
}
public class School(){
  private String name;
}

我想过滤所有在 X 学校有 child 的父亲。

这就是我所做的,但无法正常工作:

 Specification specs = new Specificatrion(){
        @Override
        public Predicate toPredicate(Root<Father> root, CriteriaQuery<?> query, final CriteriaBuilder cb){
             Root<Child> childRoot = query.from(Child.class);
             Path<?> path = childRoot.get(Child_.school.name);
             Predicate pred = exp.in("School Name");
             return cb.and(pred);
         }
}

有人可以帮我解决这个问题吗? 谢谢!

最佳答案

您必须在 child 与父亲之间建立反向关系,以便 child 可以在学校和父亲之间架起桥梁。

这样的事情会起作用:

@Entity
public class Father {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;

    @OneToMany(mappedBy = "father", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<Child> childs = new HashSet<>();


@Entity
public class Child {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    private Integer age;

    @ManyToOne(cascade=CascadeType.ALL)
    private Father father;

    @OneToOne(cascade = CascadeType.PERSIST)
    private School school;

然后在你的FatherRepository中:

@Query("select father from Child child join child.father father join child.school school where school.name=:school")
List<Father> findBySchool(@Param("school") String school);

关于java - JPA 与规范 - 如何通过子集合内容过滤实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42857947/

相关文章:

sql-server-2008 - 有没有办法过滤 SQL Profiler 跟踪?

java - 工作流内容处理

java - 如何使用java模式匹配器解析 'P'之后的所有内容?

java - 在 JBoss 上部署问题

java - 如何在 java android 中运行进度条时禁用正在运行的 Activity

java - 这个多对多关系的 "Owning Side"是怎么确定的呢?

java - JPA插入错误

java - hibernate auto create in-memory hsqldb 导致找不到序列

java - 使用正则表达式进行名称过滤器 - Java

php - 具有多个条件的 OData 查询 $filter