Saya agak baru mengenal JPA 2 dan itu API CriteriaBuilder / CriteriaQuery:
CriteriaQuery
dalam tutorial Java EE 6
Saya ingin menghitung hasil dari CriteriaQuery tanpa benar-benar mengambilnya. Apakah itu mungkin, saya tidak menemukan metode seperti itu, satu-satunya cara adalah melakukan ini:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<MyEntity> cq = cb
.createQuery(MyEntityclass);
// initialize predicates here
return entityManager.createQuery(cq).getResultList().size();
Dan itu bukanlah cara yang tepat untuk melakukannya ...
Apakah ada solusinya?
java
jpa-2.0
criteriaquery
Sean Patrick Floyd
sumber
sumber
Jawaban:
Jenis kueri
MyEntity
akan kembaliMyEntity
. Anda menginginkan kueri untuk fileLong
.Jelas Anda ingin membangun ekspresi Anda dengan batasan dan pengelompokan apa pun, dll. Yang Anda lewati dalam contoh.
sumber
qb.count
ini sudah selesai atasRoot<MyEntity>
kueri Anda (Root<MyEntity>
myEntity = cq.from (MyEntity.class)) dan ini sering kali sudah ada dalam kode pilih normal Anda dan ketika Anda lupa Anda berakhir dengan join to self.Saya telah memilah ini menggunakan cb.createQuery () (tanpa parameter tipe hasil):
Semoga membantu :)
sumber
sumber
Seperti orang lain jawaban benar, tapi terlalu sederhana, jadi untuk kelengkapan aku presentasi di bawah ini potongan kode untuk melakukan
SELECT COUNT
pada canggih permintaan Kriteria JPA (dengan beberapa bergabung, fetch, kondisi).Ini sedikit mengubah jawaban ini .
Semoga menghemat waktu seseorang.
Karena IMHO JPA Criteria API tidak intuitif atau cukup mudah dibaca.
sumber
recursion on databases
? Saya berbicara tentang rekursi pada level API. Jangan bingung dengan konsep-konsep ini :-) JPA hadir dengan API yang sangat kuat / kompleks yang memungkinkan Anda melakukan banyak penggabungan / pengambilan / agregasi / alias dll dalam satu kueri. Anda harus menghadapinya sambil menghitung.Agak rumit, tergantung pada implementasi JPA 2 yang Anda gunakan, yang ini berfungsi untuk EclipseLink 2.4.1, tetapi tidak untuk Hibernate, berikut jumlah CriteriaQuery generik untuk EclipseLink:
Beberapa hari yang lalu saya bermigrasi dari EclipseLink ke Hibernate dan harus mengubah fungsi penghitungan saya ke yang berikut, jadi silakan gunakan karena ini adalah masalah yang sulit dipecahkan, mungkin tidak berfungsi untuk kasus Anda, itu telah digunakan sejak Hibernate 4.x, perhatikan bahwa saya tidak mencoba menebak mana yang merupakan root, sebaliknya saya meneruskannya dari kueri sehingga masalah terpecahkan, terlalu banyak kasus sudut yang ambigu untuk ditebak:
sumber
Anda juga dapat menggunakan Proyeksi:
sumber
Dengan Spring Data Jpa, kita dapat menggunakan metode ini:
sumber