我面临着通过列表中子项的值过滤实体的问题。 例如:
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/