9

SpringデータJPA仕様を使用してエンティティPersonからリストを取得する際に問題があります(ページネーションのため)。個人ごとにすべてのメモを取得する必要がありますが、これら 2 つのエンティティ間の依存関係は個人側にあります。Note には Person に関連する属性が含まれていないため、Predicate の作成方法がわかりません。

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

            }
        };
    }

ありがとう、ズデント

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 に答える