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?

tukang
sumber

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.

Salandur
sumber
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();
marioosh
sumber
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.

Antonio
sumber
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.

Jon Spokes
sumber
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();
rajadilipkolli
sumber
6
Long count = (Long) session.createQuery("select count(*) from  Book").uniqueResult();
xrcwrn
sumber
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();
}
LucianoDemuru
sumber
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.

Vlad Mihalcea
sumber