Відповіді:
Для старих версій Hibernate (<5.2):
Припустимо, що назва класу: Book:
return (Number) session.createCriteria("Book")
.setProjection(Projections.rowCount())
.uniqueResult();
Це принаймні а Number
, швидше за все, а Long
.
return (Number) session.createCriteria(Book.class).setProjection(Projections.rowCount()).uniqueResult();
У Java мені зазвичай потрібно повернути Int і використовувати цю форму:
int count = ((Long)getSession().createQuery("select count(*) from Book").uniqueResult()).intValue();
Ось що нам повідомляють про це офіційні сплячі документи :
Ви можете порахувати кількість результатів запиту, не повертаючи їх:
( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()
Однак це не завжди повертає Integer
екземпляр, тому його краще використовувати java.lang.Number
для безпеки.
org.hibernate.dialect.function.StandardAnsiSqlAggregationFunctions.CountFunction
( StandardBasicTypes.LONG )
Ви можете спробувати count(*)
Integer count = (Integer) session.createQuery("select count(*) from Books").uniqueResult();
Звідки Books
назва class
- не таблиця в базі даних.
Якщо ви використовуєте Hibernate 5+, запит буде змінено як
Long count = session.createQuery("select count(1) from Book")
.getSingleResult();
Або якщо вам потрібен TypedQuery
Long count = session.createQuery("select count(1) from Book",Long.class)
.getSingleResult();
Long count = (Long) session.createQuery("select count(*) from Book").uniqueResult();
Це працює в сплячому режимі 4 (випробувано).
String hql="select count(*) from Book";
Query query= getCurrentSession().createQuery(hql);
Long count=(Long) query.uniqueResult();
return count;
Де getCurrentSession ():
@Autowired
private SessionFactory sessionFactory;
private Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}
Це дуже просто, просто запустіть наступний запит JPQL:
int count = (
(Number)
entityManager
.createQuery(
"select count(b) " +
"from Book b")
.getSingleResult()
).intValue();
Причина, по якій ми робимо кастинг, Number
полягає в тому, що деякі бази даних повернуться, Long
а інші повернуться BigInteger
, тому для портативності вам краще віддати ліцензію на a Number
і отримати а int
чи a long
, залежно від того, скільки рядків ви очікуєте для підрахунку.