Почему нет CriteriaQuery <T> #where (List <Predicate>)?

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

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

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

Зачем спрашивать об этом здесь? Лучшим и более логичным местом был бы список рассылки спецификации JPA, поскольку у них якобы была какая-то причина для сортировки отсутствующих методов accounts.eclipse.org/mailing-list/jpa-dev

user3973283 10.09.2018 10:09

Обоснование можно было бы состоит в том, что даже метод where(Predicate...) редко будет использоваться с более чем одним Predicate, поскольку Predicate обычно объединяются с помощью CriteriaBuilder.and() / CriteriaBuilder.or() (аналогично, вы используете AND/OR для соединения условий в JPQL, в отличие от использования списков, разделенных запятыми, с SELECT, GROUP BY и ORDER BY)

crizzis 10.09.2018 16:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
109
3

Ответы 3

Сначала вы должны построить предикаты критериев, используя, например, CriteriaBuilder для создания CriteriaQuery. К тому времени, как вы получите `CriteriaQuery.

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

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

Прошу отсутствия where(List<Predicate>). Я уже знаю о where(Predicate...).

Jin Kwon 10.09.2018 08:46

Я не уверен, правильно ли я понял ваш вопрос или нет, но я использовал 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.

Другие вопросы по теме