Spring-Data-JPA avec QueryDslPredicateExecutor et Rejoindre une collection
Disons que j'ai un modèle de données comme ceci (pseudo-code):
@Entity
Person {
@OneToMany
List<PersonAttribute> attributes;
}
@Entity
PersonAttribute {
@ManyToOne
AttributeName attributeName;
String attributeValue;
}
@Entity
AttributeName {
String name;
}
J'ai un Spring-Data-JPA référentiel défini comme:
public interface PersonRepository extends PagingAndSortingRepository<Person, Long>, QueryDslPredicateExecutor<Person>{}
Je vois dans le QueryDSL de la documentation qu'il existe un mécanisme à Joindre la Personne à la PersonAttribute, mais il semble que vous avez besoin d'accéder à la QueryDsl objet de Requête, le client de l'référentiel n'auraient pas.
Ce que je voudrais faire avec mon Prédicat est de trouver toutes les Personnes qui ont un Attribut (il y a une jointure) avec une valeur de "bleu" et le Nom de l'attribut (il y a une autre jointure) avec un nom de "couleuryeux". Je ne suis pas sûr de savoir comment je le ferais avec un any()
et faire valoir ce que je ne reçois que ceux avec eye_color=bleu et non pas ceux avec shoe_color=bleu.
J'espérais que je pourrais faire quelque chose comme ceci:
QPerson person = QPerson.person;
QPersonAttribute attribute = person.attributes.any();
Predicate predicate = person.name.toLowerCase().startsWith("jo")
.and(attribute.attributeName().name.toLowerCase().eq("eye color")
.and(attribute.attributeValue.toLowerCase().eq("blue")));
mais avec le any()
là il vient de matches de quoi que ce soit avec une valeur d'attribut de "bleu" et quoi que ce soit avec une "couleur des yeux" attribut, indépendamment de leur couleur. Comment je peux faire de ces conditions s'appliquent à la même attribut dans la série?
source d'informationauteur digitaljoel
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas adhérer directement à une colonne dans un prédicat, mais vous pouvez créer un tout() des expressions comme ce
Cette approche a la restriction de l'expression de la jointure
QPerson.person.attributes.any()
peut être utilisé que dans un seul filtre. Il a cependant l'avantage que cette expression est convertie en une sous-requête qui n'entre pas en conflit avec la pagination.Pour de multiples restrictions, vous aurez besoin de construire une sous-requête expression explicitement comme ce
En plus de
QueryDslPredicateExecutor
vous pouvez également utiliser Querydsl des requêtes via Ressort des Données de cetteExemple pris d'ici https://blog.42.nl/articles/spring-data-jpa-with-querydsl-repositories-made-easy/