JPA / JPQL COUNT вопрос - PullRequest
       9

JPA / JPQL COUNT вопрос

3 голосов
/ 22 января 2011

У меня следующий запрос JPQL -

SELECT f.md5 
FROM File f, Collection leafCollections, Collection instCollections 
WHERE (f.status = com.foo.bar.FileStatus.Happy OR f.status = com.foo.bar.FileStatus.Sad) 
      AND f.collectionId = leafCollections.collectionId 
      AND leafCollections.instanceCollectionId = instCollections.collectionId 
GROUP BY f.md5, instCollections.collectionId 

Он в основном возвращает md5 для файлов, которые организованы в иерархию (дерево), так что если один и тот же MD5 появляется в более чем одном листе в определенной ветви иерархии, он будет показан только один раз (благодаря GROUP BY ).

Это отлично работает. Допустим, я вернул 100 строк. Каждая строка, содержащая md5 в качестве строки.

Теперь я хочу получить COUNT возвращенных строк. Я думал, что мог бы просто сделать:

SELECT COUNT(f.md5) 
FROM File f, Collection leafCollections, Collection instCollections 
WHERE (f.status = com.foo.bar.FileStatus.Happy OR f.status = com.foo.bar.FileStatus.Sad) 
      AND f.collectionId = leafCollections.collectionId 
      AND leafCollections.instanceCollectionId = instCollections.collectionId 
GROUP BY f.md5, instCollections.collectionId 

Однако это возвращает 100 строк, каждая из которых содержит long, представляющий количество раз, когда md5 появлялся в ветке. Я хотел просто получить обратно 1 строку с длинным значением 100, равным общему количеству строк, возвращенных исходным запросом. Я чувствую, что упускаю что-то очевидное.

Предложения?

1 Ответ

6 голосов
/ 29 июня 2011

Как прокомментировал @ doc_180.Использование getSingleResult() приведет к подсчету

Используйте следующий код для получения результата.

// Assuming that the Query is strQ
Query q = entityManager.createQuery( strQ );
int count = ( (Integer) q.getSingleResult() ).intValue();
...