Подтвердить что ты не робот

Какая разница между операторами IN и MEMBER OF JPQL?

Какая разница между операторами IN и MEMBER OF JPQL?

4b9b3361

Ответ 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, т.е. коллекции, которая фактически является частью объектной модели.