8 методов использования предложения «NOT IN» в запросах критериев JPA

При работе с запросами критериев JPA (Java Persistence API) предложение «NOT IN» может стать мощным инструментом для фильтрации и извлечения данных. В этой статье мы рассмотрим восемь различных методов использования предложения «NOT IN» в запросах критериев JPA, а также приведем примеры кода для каждого метода.

Метод 1: использование списка значений

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Entity> query = cb.createQuery(Entity.class);
Root<Entity> root = query.from(Entity.class);
List<String> values = Arrays.asList("value1", "value2", "value3");
query.select(root).where(root.get("property").notIn(values));
List<Entity> results = entityManager.createQuery(query).getResultList();

Метод 2: использование подзапроса

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Entity> query = cb.createQuery(Entity.class);
Root<Entity> root = query.from(Entity.class);
Subquery<String> subquery = query.subquery(String.class);
Root<Entity> subRoot = subquery.from(Entity.class);
subquery.select(subRoot.get("property")).where(subRoot.get("property").in("value1", "value2", "value3"));
query.select(root).where(root.get("property").not(cb.in(subquery)));
List<Entity> results = entityManager.createQuery(query).getResultList();

Метод 3: использование вложенного выбора

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Entity> query = cb.createQuery(Entity.class);
Root<Entity> root = query.from(Entity.class);
query.select(root).where(cb.not(cb.in(root.get("property")).value("value1", "value2", "value3")));
List<Entity> results = entityManager.createQuery(query).getResultList();

Метод 4. Использование буквального метода CriteriaBuilder

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Entity> query = cb.createQuery(Entity.class);
Root<Entity> root = query.from(Entity.class);
query.select(root).where(cb.not(cb.in(root.get("property")).value(cb.literal("value1"), cb.literal("value2"), cb.literal("value3"))));
List<Entity> results = entityManager.createQuery(query).getResultList();

Метод 5: использование кортежа

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Tuple> query = cb.createTupleQuery();
Root<Entity> root = query.from(Entity.class);
query.multiselect(root.get("property")).where(cb.not(cb.in(root.get("property")).value("value1", "value2", "value3")));
List<Tuple> results = entityManager.createQuery(query).getResultList();

Метод 6: использование типизированного запроса

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Entity> query = cb.createQuery(Entity.class);
Root<Entity> root = query.from(Entity.class);
query.select(root).where(cb.not(cb.in(root.get("property")).value("value1", "value2", "value3")));
TypedQuery<Entity> typedQuery = entityManager.createQuery(query);
List<Entity> results = typedQuery.getResultList();

Метод 7: использование предиката

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Entity> query = cb.createQuery(Entity.class);
Root<Entity> root = query.from(Entity.class);
Predicate notInPredicate = cb.not(root.get("property").in("value1", "value2", "value3"));
query.select(root).where(notInPredicate);
List<Entity> results = entityManager.createQuery(query).getResultList();

Метод 8: использование именованного запроса

@NamedQuery(name = "Entity.findNotInValues", query = "SELECT e FROM Entity e WHERE e.property NOT IN :values")
public class Entity {
    // ...
}
TypedQuery<Entity> query = entityManager.createNamedQuery("Entity.findNotInValues", Entity.class);
query.setParameter("values", Arrays.asList("value1", "value2", "value3"));
List<Entity> results = query.getResultList();

В этой статье мы обсудили восемь различных методов использования предложения «NOT IN» в запросах критериев JPA. Эти методы обеспечивают гибкость при написании запросов и позволяют эффективно извлекать данные на основе критериев исключения. Используя эти методы, разработчики могут улучшить свои запросы критериев JPA с помощью предложения «NOT IN», что приведет к более надежному и эффективному извлечению данных.