Spring数据JPA规范 - @OneToMany依赖

Zde*_*end 8 spring specifications jpa criteria-api spring-data-jpa

我有使用Spring数据JPA规范从实体Person获取List的问题(因为分页).我需要逐个获得所有笔记,但这两个实体之间的依赖关系是在人员方面.我不知道如何创建我的谓词因为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;
}
Run Code Online (Sandbox Code Playgroud)

通常情况下,我会写这样的东西,但我没有注释中的属性人,数据库在此阶段无法重新映射.

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

            }
        };
    }
Run Code Online (Sandbox Code Playgroud)

谢谢你,Zdend

Zde*_*end 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);
            }
        };
    }
Run Code Online (Sandbox Code Playgroud)

  • 必须有一个更好的方法,而不是将它与in子句中的复杂化....你应该考虑在你的Note类中添加`@ManyToOne Person person;`,这样你就可以做一个简单的Join. (3认同)