Jestem raczej nowy w JPA 2 i jest to interfejs API CriteriaBuilder / CriteriaQuery:
CriteriaQuery
w samouczku Java EE 6
Chciałbym policzyć wyniki CriteriaQuery bez ich pobierania. Czy to możliwe, nie znalazłem takiej metody, jedynym sposobem byłoby to zrobić:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<MyEntity> cq = cb
.createQuery(MyEntityclass);
// initialize predicates here
return entityManager.createQuery(cq).getResultList().size();
I to nie może być właściwy sposób, aby to zrobić ...
Czy jest jakieś rozwiązanie?
java
jpa-2.0
criteriaquery
Sean Patrick Floyd
źródło
źródło
Odpowiedzi:
Zapytanie typu
MyEntity
zamierza powrócićMyEntity
. Chcesz zapytać oLong
.Oczywiście będziesz chciał zbudować swoją ekspresję z wszelkimi ograniczeniami, grupowaniami itp., Które pominąłeś w przykładzie.
źródło
qb.count
jest to wykonywane przezRoot<MyEntity>
twoje zapytanie (Root<MyEntity>
myEntity = cq.from (MyEntity.class)) i często jest to już w twoim normalnym kodzie wyboru, a kiedy zapomnisz, kończysz się złączeniem do siebie.Rozwiązałem to za pomocą cb.createQuery () (bez parametru typu wyniku):
Mam nadzieję, że to pomoże :)
źródło
źródło
Ponieważ inne odpowiedzi są poprawne, ale zbyt proste, więc dla kompletności przedstawiam poniżej fragment kodu do wykonania
SELECT COUNT
w wyrafinowanym zapytaniu Kryteriów JPA (z wieloma połączeniami, pobraniami, warunkami).Jest to nieco zmodyfikowana tę odpowiedź .
Mam nadzieję, że to oszczędza komuś czas.
Ponieważ interfejs IMHO JPA Criteria API nie jest intuicyjny ani całkiem czytelny.
źródło
recursion on databases
? Mówiłem o rekurencji na poziomie API. Nie myl tych pojęć :-) JPA jest dostarczany z bardzo wydajnym / złożonym interfejsem API, który pozwala na wykonywanie wielu połączeń / pobierania / agregacji / aliasów itp. W jednym zapytaniu. Musisz sobie z tym poradzić podczas liczenia.Jest to trochę trudne, w zależności od używanej implementacji JPA 2, ta działa dla EclipseLink 2.4.1, ale nie dla Hibernate, tutaj ogólna liczba CriteriaQuery dla EclipseLink:
Niedawno przeprowadziłem migrację z EclipseLink do Hibernate i musiałem zmienić moją funkcję zliczania na następującą, więc nie krępuj się jej użyć, ponieważ jest to trudny problem do rozwiązania, może nie działać w twoim przypadku, był używany od czasu hibernacji 4.x, zauważ, że nie próbuję odgadnąć, który jest korzeń, zamiast tego przekazuję go z zapytania, więc problem został rozwiązany, zbyt wiele niejednoznacznych przypadków narożnych, aby spróbować odgadnąć:
źródło
Możesz także użyć Projekcji:
źródło
Z Spring Data Jpa możemy skorzystać z tej metody:
źródło