IN tests - это значение выражения с одним значением пути (постоянный атрибут вашей сущности) в значениях, которые вы указали для запроса (или были получены с помощью подзапроса).
MEMBER OF tests - это значение, которое вы указали для запроса (или определения с помощью выражения) члена значений в некоторой коллекции в вашей сущности.
Давайте использовать следующий пример объекта:
@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;
}
}
и следующие данные испытаний:
EntityA a1 = new EntityA(1, 1, Arrays.asList(4, 5, 6));
EntityA a2 = new EntityA(2, 2, Arrays.asList(7, 8, 9));
С помощью следующего запроса мы получаем a1 как результат, потому что someValue является одним из (0,1,3). Использование литералов в запросе ( SELECT FROM EntityA, ГДЕ a.someValue IN (0, 1, 3) ) дает тот же результат.
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();
С помощью следующего запроса мы получаем a2 как результат, потому что 7 является одним из значений в 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();
Эта функциональность (включая коллекцию как параметр) определена в спецификации JPA 2.0 и не относится к Hibernate (приведенный выше код работает, например, с EclipseLink).