2013-11-14 3 views
1

То, что я пытаюсь сделать, это считает строка подходит к напечатали критерии (я должен предупредить пользователь, что поиск будет провести некоторое время x rows * (estimated time for one row), мой код выглядит следующим образом:Как подсчитать количество строк в Criteria Апи

CriteriaBuilder qb = em.getCriteriaBuilder(); 
CriteriaQuery<Long> criteria = qb.createQuery(Long.class); 
Root<TrackingDAO> p = criteria.from(TrackingDAO.class); 
criteria.select(qb.count(criteria 
      .from(TrackingDAO.class))); 
/* my stuff with criteria */ 
TypedQuery<Long> q = em.createQuery(criteria); 
setCounterOfLookUpResults(q.getSingleResult()); 

Класс работает отлично, пока я не получил результаты, они совершенно странно, как, например, 56432 и я ожидаю, например, 430.

Может кто-нибудь сказать мне, как «пинг» базы данных и спросить, сколько строк он собирается Предоставьте мне, прежде чем я извлечу эти строки?

+0

Вы код выглядит хорошо для меня, вы уверены в своих критериях и присоединяетесь? – ssssteffff

+0

Моих критерии выглядят следующим образом: criteria.where (qb.and (qb.like (р прибудет (EntityName), пары), \t \t \t qb.between (р прибудет ("начальное время"), getFromTime..(), \t \t \t getToTime()), \t \t \t qb.equal (р прибудете ("статус".), GetStatus()) \t \t \t)); Теперь я попробовал снова, и результаты кода выше были 13112, тогда как окончательный эффект был всего 2 строки! не знаю, где проблема –

+0

criteria.select (qb.count (p.get (TrackingDAO_.id))); как предложил Роман С, отлично работал. –

ответ

3

Используйте Projections, чтобы получить количество строк из критериев

criteria.setProjection(Projections.rowCount()); 
    return Integer.parseInt(criteria.list().get(0).toString()); 

или

criteria.select(qb.count(p.get(TrackingDAO_.id))); 
+0

спасибо за быстрый ответ, но метод setProjection (...) не работает с CriteriaQuery, я бы хотел избежать изменения всех критериев в классе Criteria из CriteriaQuery –

+0

Второй метод работает с критериями, относящимися к классу CriteriaQuery. Он был эквивалентен встроенному sql-запросу как: SELECT count (id) FROM my_table WHERE (parama

0

Большинства баз данных не знают, что вы собираетесь спросить, прежде чем попросить об этом в зависимости от вашего ИНЕКЕ. Таким образом, наиболее общий способ сделать это - написать метод, который берет вашу таблицу, и ваше предложение where и делает счет (*) против него, и сообщает вам, сколько строк будет соответствовать вашему запросу.

0

Вы можете использовать проекции, чтобы подсчитать ряд

criteria.setProjection(Projections.rowCount()); 
int count = Integer.valueOf(criteria.uniqueResult()); 
1

Все выглядит как метод подсчета в моем случае возвращает каждое действие во время выполнения моего кода, я полагаю, по номерам, как: 6949360, когда запрос возвращает 430 результатов, и «только» 1131, когда у меня есть 1 результат

Смежные вопросы