JPA mendukung dua cara untuk mengekspresikan kueri untuk mengambil entitas dan data persisten lainnya dari database: pernyataan kueri (Java Persistence Query Language, JPQL) dan kriteria API (kriteria API). JPQL adalah pernyataan kueri independen-basis data yang digunakan untuk mengoperasikan model entitas logis daripada model data fisik. API bersyarat adalah membangun kondisi kueri berdasarkan model entitas
1. Memulai dengan pernyataan kueri Java yang gigih
Salinan kode adalah sebagai berikut: Daftar <Fone> orang = EntityManager.creequery ("Pilih P dari Person P"). GetResultList ();
1. Pernyataan kueri ini mirip dengan SQL. Tetapi perbedaan antara itu dan SQL nyata adalah bahwa alih -alih membuat kueri seleksi dari tabel, itu menentukan entitas dari model domain aplikasi.
2. Klausa Pilih Kueri hanya mencantumkan alias entitas kueri. Jika Anda hanya meminta kolom tertentu, Anda dapat menggunakan operator DOT (.) Untuk menavigasi properti entitas. Seperti yang ditunjukkan di bawah ini:
Salinan kode adalah sebagai berikut: Daftar <String> orang = EntityManager.createQuery ("Pilih P.FirstName dari Person P"). GetResultList ();
1.1. Kriteria filter
Seperti SQL, JPQL juga mendukung di mana klausa, yang digunakan untuk memfilter kriteria pencarian. Termasuk sebagian besar operator, seperti: di, antara, suka, substring ekspresi fungsi, panjang, dll.
Salinan kode adalah sebagai berikut: Daftar <Fone> orang = EntityManager.creequery ("Pilih p dari orang P di mana P.age> 23"). GetResultList ();
1.2. Hasil proyeksi
Jika jumlah data yang ditanya relatif besar, Anda dapat menggunakan proyeksi untuk meminta kolom yang bermanfaat.
Salinan kode adalah sebagai berikut:/Daftar Proyek <Poles> orang = EntityManager.createQuery ("Pilih P.FirstName, P.age dari Person P"). GetResultList ();
1.3. Kueri Agregasi
Sintaks kueri agregat JPQL mirip dengan SQL. Misalnya jumlah
Salinan kode adalah sebagai berikut: Daftar <Integer> Count = EntityManager.CreateQuery ("Pilih Count (p) dari Person P"). GetResultList ();
1.4. Parameter kueri
JPQL mendukung dua jenis sintaks pengikat parameter.
1. Representasi parameter posisi
Di mana parameter ditunjukkan dalam string kueri, yang merupakan nomor yang mengikuti parameter segera setelah tanda tanya (?). Saat menjalankan kueri, pengembang menentukan parameter yang harus diganti
Kueri kueri = EntityManager.createquery ("Pilih p dari orang p di mana p.age =? 1 dan p.firstname =? 2"); query.setParameter (1,21); query.setParameter (2, "jack"); 2. Notasi parameter bernama
Dengan mengikuti usus besar (:) dan menunjukkannya di string kueri, pengembang menentukan nama parameter yang harus diganti saat menjalankan kueri
Kueri kueri = EntityManager.createquery ("Pilih p dari orang P di mana p.age =: usia dan p.firstname =: name"); query.setParameter ("usia", 21); query.setParameter ("name", "jack");2. Tentukan kueri
JPA menyediakan antarmuka kueri dan typedQuery (diperkenalkan oleh JPA 2.0) untuk mengonfigurasi dan menjalankan kueri. Kueri Mengembalikan tipe objek, sementara TypedQuery mengembalikan jenis kelas yang ditentukan.
// Tidak ada tipe yang ditentukan, pengembalian tipe objek kueri q = entityManager.creequery ("pilih p dari orang p"); // tentukan tipe pengembalian sebagai tipe orang typedQuery <pon> q1 = EntityManager.createquery ("Select P dari Person P", Person.class);2.1. Definisi kueri dinamis
JPA Query Engine dapat mengurai string JPQL ke dalam pohon sintaks, mendapatkan metadata peta objek entitas-relasional dalam ekspresi, dan kemudian menghasilkan SQL yang setara. Oleh karena itu, ada dua cara untuk melakukan permintaan dinamis.
1. Metode String Plit
Kiat: Akan menyebabkan masalah injeksi SQL
/** * Kondisi permintaan string konstruksi string dinamis * * @param nama * @param usia * @return */public static string queryPersonJpql (nama string, int evence) {string queryql = "pilih p dari orang p di mana p.firstname = '" + name + "' dan p.age =" + usia; return queryql;} // call query kueri = EntityManager.createqueery (queryPersonJpql ("jack", 21)); 2. Dinamis Parameterisasi Konstruksi Kondisi Kueri (Direkomendasikan)
/** * Dinamis Parameterisasi Kondisi Kondisi Kondisi * * @Return */Public Static String QueryPersonJpqlbyParams () {String queryql = "Pilih P dari orang P di mana p.firstname =: name dan p.age =: usia"; return queryql;} kueri kueri = entityManager.createqueery (queryPersonJpqlbyparams ()); query.setParameter ("name", "jack"); query.setParameter ("Age", 21);2.2. Definisi kueri bernama
Named Query adalah alat yang ampuh. Gunakan anotasi @NamedQuery untuk menentukan kueri bernama yang dapat ditempatkan di atas definisi kelas entitas apa pun. Anotasi ini mendefinisikan nama kueri dan teksnya.
Kiat: Kueri bernama ditempatkan di kelas entitas yang sesuai dengan hasil kueri
@Entitas@namedQuery (name = "findByage", query = "Select p dari Person P Where P.Age =: Age") Public Class Person {// dihilangkan} Nama yang ditentukan dalam tip: NamedQuery harus unik di seluruh unit kegigihan, jika tidak akan ada kesalahan dalam operasi.
misalnya:
Salinan kode adalah sebagai berikut:
Pengecualian dalam utas "utama" org.hibernate.duplicatemappingException: pemetaan permintaan duplikat FindByage di org.hibernate.boot.internal.inflightmetadatacollectorImpl.checkQueryName
Panggilan
Salinan kode adalah sebagai berikut:
Daftar <Son> People = EntityManager.CreateNamedQuery ("FindByage", Person.class) .setParameter ("Age", 21) .getResultList ();
Jika kelas mendefinisikan dua atau lebih kueri bernama, itu harus ditempatkan di @NamedQueries ()
2.3. Parameter yang mengikat
Melalui contoh sebelumnya, kita dapat melihat bahwa ada dua cara untuk mengikat parameter: 1. Ikatan parameterisasi posisi. 2. Nama mengikat parameter. Semua terikat melalui metode setParameter dari antarmuka kueri.
1. Parameterisasi posisi
TypedQuery <x> setParameter (posisi int, nilai objek);
2. Parameterisasi Nama
TypedQuery <x> setParameter (nama string, nilai objek);
Yang pertama adalah posisi ikatan parameterisasi. Jika posisi berubah, kode terikat perlu diubah. Tipe kedua direkomendasikan.
2.4. Jalankan kueri
Antarmuka kueri dan antarmuka TypedQuery menyediakan tiga cara berbeda untuk melakukan kueri.
1. ExecuteUpdate
Digunakan untuk melakukan pembaruan atau penghapusan batch
2.Getsingleresult
Dapatkan set hasil tunggal. Jika tidak ada data yang diperoleh, noresultException akan dilemparkan. Jika beberapa bagian data diperoleh, nonuniqueresultException akan dilemparkan
3.GetResultList
Dapatkan set hasil yang sesuai dan tentukan urutan set. Daftar perlu digunakan sebagai tipe nilai pengembalian. Jika tidak ada data yang diperoleh, set kosong dikembalikan dan tidak ada pengecualian yang dilemparkan
2.5. Pagination
Kueri pagination dapat diselesaikan melalui metode setFirStresult () dan setmaxResults ()
Nomor halaman kueri adalah 0, dan 2 lembar data ditampilkan di setiap halaman
Salinan kode adalah sebagai berikut:
Daftar <Son> People = EntityManager.createQuery ("Pilih P dari Person P", Person.Class) .setFirStresult (0) .setMaxResults (2) .getResultList ();
Kiat: Tidak dapat digunakan untuk kueri yang dihubungkan oleh hubungan pengumpulan, karena kueri ini dapat mengembalikan nilai duplikat.
2.6. Timeout kueri
Jika aplikasi perlu menetapkan batas waktu respons kueri, Anda dapat mengatur properti javax.persistence.query.timeout dalam kueri (diperkenalkan oleh JPA 2.0) atau menggunakannya sebagai bagian dari properti kegigihan. Properti ini menentukan jumlah == milidetik yang diizinkan untuk dijalankan sebelum kueri diakhiri. Jika batas waktu kueri, QueryTimeOutException akan dilemparkan.
TypedQuery <Fone> query = EntityManager.createQuery ("Select P dari Person P", Person.class); // Unit ini adalah milidetik javax.persistence.Query.TimeOutQuery.sethint ("javax.persistence.timeout", 5000); listhint ("query = query.2.7. Pembaruan dan penghapusan batch
Entitas pembaruan batch diselesaikan melalui pernyataan pembaruan. Penghapusan batch entitas dilakukan melalui pernyataan penghapusan. Keduanya menentukan sifat entitas dan kelasnya.
EntityManager.getTransAction (). Begin (); Query Query = EntityManager.createQuery ("Perbarui Orang P Set P.FirstName =: Name Where P.id =: Id"); Query.setParameter ("Name", "Xiaobai"); query.setParameter ("id", 2); query.execece "); query.setParameter (" id ", 2); query.execeCute"); query.setParameter ("id", 2); query.execeCeCeCe "); query1 (" id ", 2); query.execec EntityManager.createQuery ("Delete Person P di mana p.id =: id"); query1.setParameter ("id", 9); query1.executeUpdate (); entityManager.getTransaction (). commit ();3. Saran untuk menggunakan kueri jpql
Dalam sistem aplikasi, jumlah kueri biasanya digunakan lebih dari menambahkan, memodifikasi, dan menghapus. Oleh karena itu, sangat penting untuk menggunakan kueri dan ditampilkan secara wajar.
1. Disarankan untuk menggunakan kueri bernama (bernama)
Program yang dibuktikan dengan kegigihan biasanya menggunakan metode yang dikompilasi untuk menggunakan kueri yang disebutkan sebagai bagian dari fase inisialisasi program. Ini menghindari sistem overhead penguraian JPQL yang terus menerus dan menghasilkan SQL.
2. Gunakan proyeksi untuk mengambil sejumlah kecil kolom terlebih dahulu.
Kueri JPA biasanya mengembalikan semua kolom dari seluruh entitas, tetapi untuk sejumlah besar data, tidak semua kolom entitas perlu digunakan. Kemudian kita dapat menggunakan proyeksi untuk menanganinya.
Daftar <Daftar <Object [] >> Orang = EntityManager.createQuery ("Pilih Daftar Baru (FirstName, Umur) dari Person P"). GetResultList (); untuk (Object O: Orang) {System.out.println (o);} // hasil output [jack, 21] [Jack, 21] [Jack, 21] [Lily, 19] [LoY, 19] [Jack, 21] [Jack, 21] [Jack, 21] [Lily, 19Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.