Я новичок в JPA 2 и его API CriteriaBuilder / CriteriaQuery:
CriteriaQuery
в руководстве по Java EE 6
Я хотел бы подсчитать результаты CriteriaQuery, не получая их на самом деле. Возможно ли, что я не нашел такого метода, единственный способ сделать это:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<MyEntity> cq = cb
.createQuery(MyEntityclass);
// initialize predicates here
return entityManager.createQuery(cq).getResultList().size();
И это не может быть правильным способом ...
Есть решение?
java
jpa-2.0
criteriaquery
Шон Патрик Флойд
источник
источник
Ответы:
Запрос типа
MyEntity
будет возвращенMyEntity
. Вам нужен запрос для файлаLong
.Очевидно, вы захотите построить свое выражение с любыми ограничениями, группировками и т. Д., Которые вы пропустили в примере.
источник
qb.count
это выполняется поRoot<MyEntity>
вашему запросу (Root<MyEntity>
myEntity = cq.from (MyEntity.class)), и это часто уже находится в вашем обычном коде выбора, и когда вы забываете, вы получаете соединение с собой.Я разобрался с этим, используя cb.createQuery () (без параметра типа результата):
Надеюсь, поможет :)
источник
источник
Как и другие правильные ответы, но слишком просто, поэтому для полноты картины я представляю ниже фрагмент кода для выполнения
SELECT COUNT
на сложный запрос JPA Criteria (с нескольких объединений, распаковывает, условия).Этот ответ немного изменен .
Надеюсь, это сэкономит чье-то время.
Потому что IMHO JPA Criteria API не интуитивно понятен и не совсем читаем.
источник
recursion on databases
? Я говорил о рекурсии на уровне API. Не путайте эти концепции :-) JPA поставляется с очень мощным / сложным API, который позволяет вам выполнять несколько соединений / выборок / агрегаций / псевдонимов и т. Д. В одном запросе. С этим нужно иметь дело при подсчете.Это немного сложно, в зависимости от используемой вами реализации JPA 2, этот работает для EclipseLink 2.4.1, но не для Hibernate, здесь общий счетчик CriteriaQuery для EclipseLink:
На днях я перешел с EclipseLink на Hibernate и мне пришлось изменить свою функцию подсчета на следующую, поэтому не стесняйтесь использовать либо, поскольку это сложная проблема для решения, она может не сработать для вашего случая, она использовалась с Hibernate 4.x, обратите внимание, что я не пытаюсь угадать, что является корнем, вместо этого я передаю его из запроса, поэтому проблема решена, слишком много двусмысленных угловых случаев, чтобы попытаться угадать:
источник
Вы также можете использовать прогнозы:
источник
С Spring Data Jpa мы можем использовать этот метод:
источник