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