Spring data JPA Spécifications - @OneToMany dépendance
j'ai un problème avec l'obtention de la Liste de l'entité Personne à l'aide de Spring data JPA cahier des charges (à cause de la pagination). J'ai besoin d'obtenir toutes les notes par personne, mais la dépendance entre ces deux entités est sur la Personne de côté. Je ne sais pas comment créer mon Prédicat parce que la Note ne contient pas d'attribut relatives à la Personne.
Je ne peux obtenir la Liste avec des Personnes de lecture, mais je ne peux pas l'utiliser de cette façon parce que j'ai besoin de données retourné paginé.
@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;
}
Normalement, je voudrais écrire quelque chose comme cela, mais je n'ai pas un attribut de la personne dans la Note de base de données et ne peut pas être redistribué à ce stade.
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);
}
};
}
Merci,
Zdend
OriginalL'auteur Zdend | 2012-08-20
Vous devez vous connecter pour publier un commentaire.
Résolu..
Il y a une meilleure façon que de compliquer avec celle dans la clause.... Vous devriez envisager d'ajouter de la
@ManyToOne Person person;
dans votre Note de la classe, alors vous pouvez faire une simple Jointure.OriginalL'auteur Zdend
Je ne suis pas sûr de savoir comment le faire avec des Prédicats, comme j'ai l'habitude de ne pas les utiliser, mais en JPQL (ou HQL, qui est similaire), vous pouvez faire quelque chose comme ceci:
C'est fondamentalement la même chose que de faire cela en SQL
Je risquerais une supposition que le Prédicat méthode a des capacités similaires comme décrit ci-dessus.
Pour la pagination, vous prendriez le TypedQuery qui est généré, soit à l'aide de la méthode ci-dessus ou à travers CriteriaBuilder (lire Prédicats), puis d'appeler setFistResult() à la page*returnCount, et setMaxResults() pour returnCount. Si vous avez besoin d'un total, je crois que la plupart des gens appellent simplement la même requête, une fois pour obtenir les données, l'autre pour faire un "count()".
OriginalL'auteur CodeChimp