web-dev-qa-db-fra.com

Quelle est la différence entre les opérateurs IN et MEMBER OF JPQL?

Quelle est la différence entre IN et MEMBER OF Opérateurs JPQL?

41
faermanj

Les tests IN sont la valeur de l'expression de chemin à valeur unique (attribut persistant de votre entité) dans les valeurs que vous avez fournies pour interroger (ou extraites via une sous-requête).

MEMBER OF tests est la valeur que vous avez fournie pour interroger (ou définir avec une expression) un membre de valeurs dans une collection de votre entité.

Utilisons l'exemple d'entité suivant:

@Entity
public class EntityA {
    private @Id Integer id;
    private Integer someValue;
    @ElementCollection
    List<Integer> listOfValues;

    public EntityA() { }

    public EntityA(Integer id, Integer someValue, List<Integer> listOfValues) {
        this.id = id;
        this.someValue = someValue;
        this.listOfValues = listOfValues;
    }
}

Et les données de test suivantes:

EntityA a1 = new EntityA(1, 1, Arrays.asList(4, 5, 6));
EntityA a2 = new EntityA(2, 2, Arrays.asList(7, 8, 9));

Avec la requête suivante, nous obtenons a1 comme résultat, car sa valeur est l'un des (0,1,3). L'utilisation de littéraux dans la requête (SELECT a FROM EntityA a WHERE a.someValue IN (0, 1, 3)) produit le même résultat.

TypedQuery<EntityA> queryIn = em.createQuery(
    "SELECT a FROM EntityA a WHERE a.someValue IN :values", EntityA.class);
queryIn.setParameter("values", Arrays.asList(0, 1, 3));
List<EntityA> resultIn = queryIn.getResultList();

Avec la requête suivante, nous obtenons a2 comme résultat, car 7 est l'une des valeurs de listOfValues:

TypedQuery<EntityA> queryMemberOf = em.createQuery(
    "SELECT a FROM EntityA a WHERE :value MEMBER OF a.listOfValues", EntityA.class);
queryMemberOf.setParameter("value", 7);
List<EntityA> resultMemberOf = queryMemberOf.getResultList();

Cette fonctionnalité (y compris la collecte en tant que paramètre) est définie dans la spécification JPA 2.0 et n'est pas spécifique à Hibernate (le code ci-dessus fonctionne par exemple avec EclipseLink).

51
Mikko Maunu

IN teste si une valeur fait partie d'une liste fixe explicite de littéraux ou de paramètres de requête.

MEMBER OF teste si une valeur est présente dans une collection JPA, c'est-à-dire une collection qui fait réellement partie du modèle objet.

13