Любопытно отсутствие CriteriaQuery<T>#where(List<Predicate>)
.
Я вижу orderBy(List<Order>)
, multiselect(List<Selection<?>>)
и groupBy(List<Expression<?>>)
.
Почему нет метода для where(List<Predicate>)
? Есть ли для этого какая-то техническая причина?
Обоснование можно было бы состоит в том, что даже метод where(Predicate...)
редко будет использоваться с более чем одним Predicate
, поскольку Predicate
обычно объединяются с помощью CriteriaBuilder.and()
/ CriteriaBuilder.or()
(аналогично, вы используете AND/OR
для соединения условий в JPQL
, в отличие от использования списков, разделенных запятыми, с SELECT
, GROUP BY
и ORDER BY
)
Сначала вы должны построить предикаты критериев, используя, например, CriteriaBuilder
для создания CriteriaQuery
. К тому времени, как вы получите `CriteriaQuery.
Кроме того, в CriteriaQuery есть where
.
Прошу отсутствия where(List<Predicate>)
. Я уже знаю о where(Predicate...)
.
Я не уверен, правильно ли я понял ваш вопрос или нет, но я использовал 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[]{}));
Метод where (..) не имеет сигнатуры: where(List<Predicate>)
. С точки зрения реализации обычно для внутреннего хранения предикатов используется список. Для метода where(Predicate ...)
массив будет преобразован в список. Так что where(List<Predicate>)
более эффективен, чем where(Predicate ...)
. Запрос должен быть подан в соответствии со спецификацией JPA.
Зачем спрашивать об этом здесь? Лучшим и более логичным местом был бы список рассылки спецификации JPA, поскольку у них якобы была какая-то причина для сортировки отсутствующих методов accounts.eclipse.org/mailing-list/jpa-dev