Какая разница между операторами IN и MEMBER OF JPQL?
Какая разница между операторами IN и MEMBER OF JPQL?
Ответ 1
В тестах есть значение однозначного выражения пути (постоянный атрибут вашего объекта) в значениях, которые вы указали для запроса (или выбраны через подзапрос).
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 a FROM EntityA a WHERE 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).
Ответ 2
IN
проверяет, является ли значение одним из явного фиксированного списка литералов или параметров запроса.
MEMBER OF
проверяет, присутствует ли значение в коллекции JPA, т.е. коллекции, которая фактически является частью объектной модели.