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ề Integerthể hiện, vì vậy tốt hơn là sử dụng java.lang.Numbercho 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 Bookslà 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 Numberlà một số cơ sở dữ liệu sẽ quay trở lại Longtrong 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 Numbervà nhận một inthoặc a long, tùy thuộc vào số lượng hàng bạn dự kiến sẽ được tính.