我在使用Spring数据JPA规范(因为分页)从实体Person获取List时遇到问题。我需要逐个获得所有笔记,但这两个实体之间的依赖关系是在人员方面。我不知道如何创建我的Predicate,因为Note不包含任何与Person相关的属性。
我只是可以获取List with Persons getter但我无法使用这种方式,因为我需要返回数据分页。
@Entity
public class Person implements Serializable {
@Id
private Long personId;
@OneToMany
@JoinColumn(name = "personId")
private List<Note> notes;
}
@Entity
public class Note implements Serializable {
@Id
private Long noteId;
}
通常,我会写这样的东西,但我没有注释中的属性人,数据库在此阶段无法重新映射。
public static Specification<Note> notesByPerson(final Long personId) {
return new Specification<Note>() {
@Override
public Predicate toPredicate(final Root<Note> root, final CriteriaQuery<?> query,
final CriteriaBuilder builder) {
final Path<Person> per = root.<Person> get("person");
return builder.equal(per.<Long> get("personId"), personId);
}
};
}
谢谢你, Zdend
答案 0 :(得分:12)
解决..
public static Specification<Note> notesByPerson(final Long personId) {
return new Specification<Note>() {
@Override
public Predicate toPredicate(final Root<Note> noteRoot, final CriteriaQuery<?> query,
final CriteriaBuilder cb) {
final Subquery<Long> personQuery = query.subquery(Long.class);
final Root<Person> person = personQuery.from(Person.class);
final Join<Person, Note> notes = person.join("notes");
personQuery.select(notes.<Long> get("noteId"));
personQuery.where(cb.equal(person.<Long> get("personId"), personId));
return cb.in(noteRoot.get("noteId")).value(personQuery);
}
};
}
答案 1 :(得分:1)
我不确定如何使用Predicates,因为我通常不使用它们,但在JPQL(或HQL,类似)中,你可以这样做:
SELECT Note n FROM Person.notes WHERE XXXX
这与在SQL中执行此操作基本相同
SELECT n.noteId FROM person as p JOIN persons_notes pn ON pn.person=p.personId JOIN notes as n ON n.noteId=pn.noteId
我猜想Predicate方法具有与上述相似的能力。