Почему нет CriteriaQuery <T># где (Список <Predicate>)? - PullRequest
0 голосов
/ 10 сентября 2018

Мне любопытно отсутствие CriteriaQuery<T>#where(List<Predicate>).

вижу orderBy(List<Order>), multiselect(List<Selection<?>>) и groupBy(List<Expression<?>>).

Почему нет метода для where(List<Predicate>)? Есть ли техническая причина для этого?

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Я не уверен, что я правильно понял ваш вопрос или нет, но я использовал sth, как в коде ниже, и использую where со списком предикатов!

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery criteriaQuery =criteriaBuilder.createQuery();
List<Predicate> predicates = new 
ArrayList<Predicate>();
Predicate predicate = null;
predicate = criteriaBuilder.equal(path, value);
predicates.add(predicate);
criteriaQuery.where(predicates.toArray(new Predicate[]{}));
0 голосов
/ 10 сентября 2018

Метод where (..) не имеет подписи: where(List<Predicate>). С точки зрения реализации, обычно список используется для внутреннего хранения предикатов. Для метода where(Predicate ...) массив будет преобразован в список. Таким образом, where(List<Predicate>) более эффективен, чем where(Predicate ...). Запрос должен быть представлен в спецификации JPA.

0 голосов
/ 10 сентября 2018

Сначала необходимо создать предикаты критериев, используя, например, CriteriaBuilder для создания CriteriaQuery. Все предикаты уже существуют, когда вы получите `CriteriaQuery.

Кроме того, в CriteriaQuery есть where

https://docs.oracle.com/javaee/6/api/javax/persistence/criteria/CriteriaQuery.html#where(javax.persistence.criteria.Predicate...)

...