9

我在使用 Spring 数据 JPA 规范从实体 Person 获取列表时遇到问题(因为分页)。我需要按人获取所有笔记,但是这两个实体之间的依赖关系在人方面。我不知道如何创建我的谓词,因为 Note 不包含任何与 Person 相关的属性。

我可以简单地使用 Persons getter 获取 List,但我不能使用这种方式,因为我需要对返回的数据进行分页。

@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;
}

通常情况下,我会写这样的东西,但是我在 Note 中没有属性 person 并且在这个阶段无法重新映射数据库。

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

4

2 回答 2

13

解决了..

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);
            }
        };
    }
于 2012-08-22T07:13:19.290 回答
1

我不确定如何使用谓词来做到这一点,因为我通常不使用它们,但是在 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 方法具有与上述类似的能力。

于 2012-08-20T16:43:07.537 回答