Ví dụ: nếu chúng ta có một bảng Sách, làm thế nào chúng ta sẽ đếm tổng số hồ sơ sách với chế độ ngủ đông?
Ví dụ: nếu chúng ta có một bảng Sách, làm thế nào chúng ta sẽ đếm tổng số hồ sơ sách với chế độ ngủ đông?
Câu trả lời:
Đối với các phiên bản cũ hơn của Hibernate (<5.2):
Giả sử tên lớp là Sách:
return (Number) session.createCriteria("Book")
.setProjection(Projections.rowCount())
.uniqueResult();
Nó ít nhất là a Number
, rất có thể là a Long
.
return (Number) session.createCriteria(Book.class).setProjection(Projections.rowCount()).uniqueResult();
Trong Java tôi thường cần trả về int và sử dụng mẫu này:
int count = ((Long)getSession().createQuery("select count(*) from Book").uniqueResult()).intValue();
Đây là những gì tài liệu ngủ đông chính thức nói với chúng tôi về điều này:
Bạn có thể đếm số lượng kết quả truy vấn mà không cần trả lại chúng:
( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()
Tuy nhiên, nó không phải lúc nào cũng trả về Integer
thể hiện, vì vậy tốt hơn là sử dụng java.lang.Number
cho an toàn.
org.hibernate.dialect.function.StandardAnsiSqlAggregationFunctions.CountFunction
( StandardBasicTypes.LONG )
Bạn có thể thử count(*)
Integer count = (Integer) session.createQuery("select count(*) from Books").uniqueResult();
Trong trường hợp Books
là tên tắt class
- không phải là bảng trong cơ sở dữ liệu.
Nếu bạn đang sử dụng Hibernate 5+, thì truy vấn sẽ được sửa đổi thành
Long count = session.createQuery("select count(1) from Book")
.getSingleResult();
Hoặc nếu bạn cần TypedQuery
Long count = session.createQuery("select count(1) from Book",Long.class)
.getSingleResult();
Long count = (Long) session.createQuery("select count(*) from Book").uniqueResult();
Điều này hoạt động trong Hibernate 4 (Đã thử nghiệm).
String hql="select count(*) from Book";
Query query= getCurrentSession().createQuery(hql);
Long count=(Long) query.uniqueResult();
return count;
Trong đó getCienSession () là:
@Autowired
private SessionFactory sessionFactory;
private Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}
Rất dễ dàng, chỉ cần chạy truy vấn JPQL sau đây:
int count = (
(Number)
entityManager
.createQuery(
"select count(b) " +
"from Book b")
.getSingleResult()
).intValue();
Lý do chúng tôi đưa ra Number
là một số cơ sở dữ liệu sẽ quay trở lại Long
trong khi các cơ sở dữ liệu khác sẽ quay trở lại BigInteger
, vì vậy, vì tính di động, tốt hơn hết bạn nên chuyển sang a Number
và nhận một int
hoặc a long
, tùy thuộc vào số lượng hàng bạn dự kiến sẽ được tính.