Спецификации Spring data JPA-зависимость @OneToMany

у меня проблема с получением списка от лица сущности, используя спецификации Spring data JPA (из-за разбиения на страницы). Мне нужно получить все заметки от человека, но зависимость между этими двумя сущностями находится на стороне человека. Я не знаю, как создать Мой предикат, потому что Note не содержит атрибута, связанного с Person.

Я просто могу получить список с помощью 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;
}

обычно я бы напишите что-то вроде этого, но у меня нет атрибута person в Note, и база данных не может быть переназначена на этом этапе.

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

            }
        };
    }

спасибо, Зденд

2 ответов


решена..

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

Я не уверен, как это сделать с предикатами, поскольку я обычно не использую их, но в 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

Я бы рискнул предположить, что метод предикатов имеет аналогичные способности, как описано выше.