В чем разница между операторами IN и MEMBER OF JPQL? - PullRequest
39 голосов
/ 06 мая 2011

В чем разница между операторами IN и MEMBER OF JPQL?

Ответы [ 2 ]

49 голосов
/ 22 марта 2012

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).

9 голосов
/ 06 мая 2011

IN проверяет, является ли значение одним из явных фиксированных списков литералов или параметров запроса.

MEMBER OF проверяет, присутствует ли значение в коллекции JPA, т. Е. Коллекции, которая фактически является частью объектной модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...