Bagaimana cara menghitung baris menggunakan Hibernate versi lama (~ 2009)?


242

Misalnya, jika kita memiliki tabel Buku, bagaimana kita menghitung jumlah total catatan buku dengan hibernate?

Jawaban:


310

Untuk versi Hibernate yang lebih lama (<5.2):

Dengan asumsi nama kelas adalah Buku:

return (Number) session.createCriteria("Book")
                  .setProjection(Projections.rowCount())
                  .uniqueResult();

Paling tidak itu adalah Number, kemungkinan besar a Long.


10
Mengembalikan lama.
dj_segfault

10
Seperti yang dikemukakan @Salandur, "Itu setidaknya sebuah Angka", dan tipe angka memiliki metode "intValue ()", "longValue ()", sehingga kita dapat dengan mudah mendapatkan tipe primitif yang kita inginkan: ((Number) criteria.uniqueResult ()) .intValue ()
Jerry Tian

5
Jika pemetaan entitas tidak dapat ditemukan menggunakan parameter string ke metode create criteria, session.createCriteria (Book.class) juga dapat digunakan
Tobias M

5
Seperti yang dikatakan @MontyBongo, saya sebenarnya harus merujuk ke kelas seperti ini: return (Number) session.createCriteria(Book.class).setProjection(Projections.rowCount()).uniqueResult();
bcmoney

2
Maka Anda seharusnya tidak menggunakan database rasional;). Nilai maksimum long adalah 9,223372037 × 10¹⁸, yang merupakan laaaaaaaaaarge
Salandur

102

Di Jawa saya biasanya perlu mengembalikan int dan menggunakan formulir ini:

int count = ((Long)getSession().createQuery("select count(*) from Book").uniqueResult()).intValue();

1
Jawaban yang diterima untuk pertanyaan ini tidak berhasil untuk saya, tetapi jawaban Anda berhasil. Terima kasih!
Jason Nichols

apakah ini cara tercepat dan termurah untuk mendapatkan hitungan kueri? maksud saya hibernate-wise
kommradHomer

57
Apa gunanya menggunakan ORM jika kita akhirnya mengkode SQL?
thermz

Itu perhatian utama saya (menggunakan SQL, bukan HQL). Saya harus menggunakan SELECT bersarang hanya untuk menghitung jumlah baris yang muncul setelah join luar kiri (saya tidak menemukan implementasi yang tepat dari join luar kiri di hibernate).
Pramod

15
Pertama, solusi ini tidak menggunakan SQL, ini HQL. Dan menggunakan hitung (*) alih-alih 'hitung pilih (e) dari E e' atau kriteria berfungsi dengan @EmbeddedId dan basis data yang tidak mendukung jumlah tuple (mis. MySQL, di mana kueri seperti 'hitung pilih ((a, b)) ) dari table1 'tidak berfungsi).
BrunoJCM

43

Inilah yang dikatakan dokumen hibernate resmi kepada kami tentang hal ini:

Anda dapat menghitung jumlah hasil permintaan tanpa mengembalikannya:

( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()

Namun, tidak selalu mengembalikan Integerinstance, jadi lebih baik digunakan java.lang.Numberuntuk keselamatan.


1
+1 untuk jawaban yang memberikan metode yang disarankan tim Hibernate.
Tom

3
Bagi saya ini memberi "java.lang.ClassCastException: java.lang.Long tidak dapat dilemparkan ke java.lang.Integer" tetapi casting ke Long malah berfungsi ...
rogerdpack

2
@rogerdpack ini karena Hibernate mengubah tipe yang dikembalikan menjadi 3,5: Long: community.jboss.org/wiki/HibernateCoreMigrationGuide35
machinery

1
Jenis pengembalian untuk fungsi penghitungan dapat ditemukan di org.hibernate.dialect.function.StandardAnsiSqlAggregationFunctions.CountFunction( StandardBasicTypes.LONG )
Guillaume Husta

12

Kamu bisa mencoba count(*)

Integer count = (Integer) session.createQuery("select count(*) from Books").uniqueResult();

Di mana Booksnama dari class- bukan tabel dalam database.


maaf tapi tidak bekerja dengan Java dan Hibernate :( (saya lakukan ganti int dengan Integer, seperti di Jawa untuk tipe casting.)
pengrajin

Itu harus bekerja - dengan Integer bukan int? Anda harus menempatkan nama kelas di HQL, bukan nama tabel - adalah satu-satunya hal yang dapat saya berpikir bahwa mungkin salah
Jon Spokes

1
Saya percaya posting langsung di bawah ini lebih sesuai dengan prinsip-prinsip inti Hibernate.
Matt Sidesinger

bagi saya itu tidak berfungsi dengan java dan hibernate. apa yang harus dilakukan?
rParvathi

6

Jika Anda menggunakan Hibernate 5+, maka kueri akan diubah sebagai

Long count = session.createQuery("select count(1) from  Book")
                    .getSingleResult();

Atau jika Anda Membutuhkan TypedQuery

Long count = session.createQuery("select count(1) from  Book",Long.class)
                        .getSingleResult();

6
Long count = (Long) session.createQuery("select count(*) from  Book").uniqueResult();

Itu harus ``` Hitungan panjang = (Panjang) session.createQuery (" pilih hitungan (1) dari Buku "). UniqueResult ();` `` itu akan meningkatkan kinerja
rajadilipkolli

1

Ini berfungsi di Hibernate 4 (Diuji).

String hql="select count(*) from  Book";
Query query= getCurrentSession().createQuery(hql);
Long count=(Long) query.uniqueResult();
return count;

Di mana getCurrentSession () adalah:

@Autowired
private SessionFactory sessionFactory;


private Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}

1

Ini sangat mudah, jalankan saja permintaan JPQL berikut:

int count = (
(Number)
    entityManager
    .createQuery(
        "select count(b) " +
        "from Book b")
    .getSingleResult()
).intValue();

Alasan kami melakukan casting Numberadalah karena beberapa database akan kembali Longsementara yang lain akan kembali BigInteger, jadi demi portabilitas Anda lebih baik melakukan casting ke Numberdan mendapatkan sebuah intatau long, tergantung pada berapa banyak baris yang Anda harapkan akan dihitung.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.