Quelle est la différence entre IN
et MEMBER OF
Opérateurs JPQL?
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).
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.