Na przykład, jeśli mamy tabelę książek, w jaki sposób policzymy całkowitą liczbę rekordów książek w trybie hibernacji?
Na przykład, jeśli mamy tabelę książek, w jaki sposób policzymy całkowitą liczbę rekordów książek w trybie hibernacji?
Odpowiedzi:
W przypadku starszych wersji Hibernacji (<5.2):
Zakładając, że nazwa klasy to Book:
return (Number) session.createCriteria("Book")
.setProjection(Projections.rowCount())
.uniqueResult();
Jest to przynajmniej Number
, najprawdopodobniej Long
.
return (Number) session.createCriteria(Book.class).setProjection(Projections.rowCount()).uniqueResult();
W Javie zazwyczaj muszę zwrócić int i użyć tego formularza:
int count = ((Long)getSession().createQuery("select count(*) from Book").uniqueResult()).intValue();
Oto, co oficjalne dokumenty dotyczące hibernacji mówią nam o tym:
Możesz policzyć liczbę wyników zapytania bez zwracania ich:
( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()
Jednak nie zawsze zwraca Integer
instancję, dlatego lepiej jest używać jej java.lang.Number
ze względów bezpieczeństwa.
org.hibernate.dialect.function.StandardAnsiSqlAggregationFunctions.CountFunction
( StandardBasicTypes.LONG )
Możesz spróbować count(*)
Integer count = (Integer) session.createQuery("select count(*) from Books").uniqueResult();
Gdzie Books
jest nazwa class
- nie tabela w bazie danych.
Jeśli używasz Hibernacji 5+, zapytanie zostanie zmodyfikowane jako
Long count = session.createQuery("select count(1) from Book")
.getSingleResult();
Lub jeśli potrzebujesz TypedQuery
Long count = session.createQuery("select count(1) from Book",Long.class)
.getSingleResult();
Long count = (Long) session.createQuery("select count(*) from Book").uniqueResult();
Działa to w Hibernacji 4 (Testowane).
String hql="select count(*) from Book";
Query query= getCurrentSession().createQuery(hql);
Long count=(Long) query.uniqueResult();
return count;
Gdzie getCurrentSession () to:
@Autowired
private SessionFactory sessionFactory;
private Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}
To bardzo proste, wystarczy uruchomić następujące zapytanie JPQL:
int count = (
(Number)
entityManager
.createQuery(
"select count(b) " +
"from Book b")
.getSingleResult()
).intValue();
Powodem, dla którego przesyłamy, Number
jest to, że niektóre bazy danych zwrócą się, Long
podczas gdy inne powrócą BigInteger
, więc ze względu na przenośność lepiej jest rzucić na a Number
i uzyskać a int
lub a long
, w zależności od liczby wierszy, których spodziewasz się policzyć.