ตัวอย่างเช่นถ้าเรามีโต๊ะหนังสือเราจะนับจำนวนระเบียนหนังสือทั้งหมดด้วยโหมดไฮเบอร์เนตได้อย่างไร
ตัวอย่างเช่นถ้าเรามีโต๊ะหนังสือเราจะนับจำนวนระเบียนหนังสือทั้งหมดด้วยโหมดไฮเบอร์เนตได้อย่างไร
คำตอบ:
สำหรับ 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();
ใช้งานได้ใน Hibernate 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
ดังนั้นเพื่อความสะดวกในการพกพาคุณจะดีกว่าที่จะส่งNumber
และรับint
หรือlong
ขึ้นอยู่กับจำนวนแถวที่คุณคาดหวังที่จะนับ