Menyusun dengan JPA

1. Gambaran keseluruhan

Artikel ini menggambarkan pelbagai cara JPA dapat digunakan untuk menyusun .

2. Menyusun Dengan JPA / JQL API

Menggunakan JQL untuk menyusun dilakukan dengan bantuan fasal Order By :

String jql; Query query = entityManager.createQuery (jql);

Berdasarkan pertanyaan ini, JPA menghasilkan pernyataan SQL lurus berikut :

Hibernate: select foo0_.id as id1_4_, foo0_.name as name2_4_ from Foo foo0_ order by foo0_.id

Perhatikan bahawa kata kunci SQL dalam rentetan JQL tidak peka huruf besar-kecil, tetapi nama entiti dan atributnya.

2.1. Menetapkan Urutan Menyusun

Secara lalai , urutan penyortiran naik , tetapi dapat ditentukan secara eksplisit dalam rentetan JQL. Sama seperti dalam SQL tulen, pilihan pesanan adalah naik dan turun :

String jql = "Select f from Foo as f order by f.id desc"; Query sortQuery = entityManager.createQuery(jql);

The SQL Pertanyaan dihasilkan kemudian akan termasuk arahan perintah itu:

Hibernate: select foo0_.id as id1_4_, foo0_.name as name2_4_ from Foo foo0_ order by foo0_.id desc

2.2. Menyusun mengikut Lebih daripada Satu Atribut

Untuk mengisih dengan beberapa atribut, ini ditambahkan ke penjuru dengan klausa rentetan JQL:

String jql; Query sortQuery = entityManager.createQuery(jql);

Kedua-dua keadaan penyortiran akan muncul dalam pernyataan pertanyaan SQL yang dihasilkan :

Hibernate: select foo0_.id as id1_4_, foo0_.name as name2_4_ from Foo foo0_ order by foo0_.name asc, foo0_.id desc

2.3. Menetapkan Mengutamakan Keutamaan Nilai Nol

Keutamaan default null adalah khusus pangkalan data, tetapi ini dapat disesuaikan melalui klausa NULLS FIRST atau NULLS LAST dalam rentetan pertanyaan HQL.

Berikut adalah contoh mudah - pesanan dengan nama daripada Foo dalam turutan dan meletakkan Null s pada akhir:

Query sortQuery = entityManager.createQuery ("Select f from Foo as f order by f.name desc NULLS LAST");

Pertanyaan SQL yang dihasilkan merangkumi nasal 1 klausa akhir 0 yang lain (baris ke-3):

Hibernate: select foo0_.id as id1_4_, foo0_.BAR_ID as BAR_ID2_4_, foo0_.bar_Id as bar_Id2_4_, foo0_.name as name3_4_,from Foo foo0_ order by case when foo0_.name is null then 1 else 0 end, foo0_.name desc

2.4. Menyusun Satu Hubungan Banyak

Melewati contoh-contoh asas, sekarang mari kita melihat kes penggunaan yang melibatkan penyortiran entiti dalam hubungan satu ke banyak - Bar yang mengandungi koleksi entiti Foo .

Kami ingin menyusun entiti Bar dan juga koleksi entiti Foo mereka - JPA sangat mudah untuk tugas ini:

  1. Menyusun Koleksi: Tambahkan anotasi OrderBy sebelum koleksi Foo di entiti Bar :
    @OrderBy("name ASC") List  fooList;
  2. Menyusun entiti yang mengandungi koleksi:
    String jql = "Select b from Bar as b order by b.id"; Query barQuery = entityManager.createQuery(jql); List barList = barQuery.getResultList();

Perhatikan bahawa anotasi @OrderBy adalah pilihan, tetapi kami menggunakannya dalam kes ini kerana kami ingin menyusun koleksi Foo setiap Bar .

Mari kita lihat pertanyaan SQL yang dihantar ke RDMS:

Hibernate: select bar0_.id as id1_0_, bar0_.name as name2_0_ from Bar bar0_ order by bar0_.id Hibernate: select foolist0_.BAR_ID as BAR_ID2_0_0_, foolist0_.id as id1_4_0_, foolist0_.id as id1_4_1_, foolist0_.BAR_ID as BAR_ID2_4_1_, foolist0_.bar_Id as bar_Id2_4_1_, foolist0_.name as name3_4_1_ from Foo foolist0_ where foolist0_.BAR_ID=? order by foolist0_.name asc 

Pertanyaan pertama menyusun entiti Bar induk . Pertanyaan kedua dihasilkan untuk menyusun koleksi entiti anak Foo milik Bar .

3. Menyusun Dengan API Objektif Kriteria JPA

Dengan Kriteria JPA - kaedah orderBy adalah alternatif "sehenti" untuk menetapkan semua parameter penyortiran: arah pesanan dan atribut yang hendak disusun dapat disetel. Berikut adalah API kaedah:

  • orderBy ( CriteriaBuilder.asc ): Susun mengikut tertib menaik.
  • orderBy ( CriteriaBuilder.desc ): Susun mengikut tertib menurun.

Setiap Order contoh dicipta dengan C riteriaBuilder objek melalui yang menaik atau menurun kaedah.

Berikut adalah contoh ringkas - menyusun Foos dengan nama mereka :

CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Foo.class); Root from = criteriaQuery.from(Foo.class); CriteriaQuery select = criteriaQuery.select(from); criteriaQuery.orderBy(criteriaBuilder.asc(from.get("name")));

Argumen untuk kaedah ge t peka huruf besar kecil, kerana harus sesuai dengan nama atribut.

Berbanding dengan JQL yang sederhana, API Objek Objektif Kriteria JPA memaksa arahan pesanan eksplisit dalam pertanyaan. Perhatikan pada baris terakhir coretan kod ini bahawa objek criteriaBuilder menentukan urutan penyortiran yang akan naik dengan memanggil kaedah ascnya .

Apabila kod di atas dilaksanakan, JPA menghasilkan pertanyaan SQL yang ditunjukkan di bawah. Objek Kriteria JPA menghasilkan pernyataan SQL dengan klausa asc eksplisit :

Hibernate: select foo0_.id as id1_4_, foo0_.name as name2_4_ from Foo foo0_ order by foo0_.name asc

3.1. Menyusun mengikut Lebih daripada Satu Atribut

Untuk mengisih dengan lebih daripada satu atribut, cukup masukkan contoh Pesanan ke kaedah orderBy untuk setiap atribut untuk diurutkan .

Berikut adalah contoh ringkas - menyusun mengikut nama dan id , mengikut urutan asc dan desc , masing-masing:

CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Foo.class); Root from = criteriaQuery.from(Foo.class); CriteriaQuery select = criteriaQuery.select(from); criteriaQuery.orderBy(criteriaBuilder.asc(from.get("name")), criteriaBuilder.desc(from.get("id")));

Pertanyaan SQL yang sesuai ditunjukkan di bawah:

Hibernate: select foo0_.id as id1_4_, foo0_.name as name2_4_ from Foo foo0_ order by foo0_.name asc, foo0_.id desc

4. Kesimpulan

Artikel ini meneroka alternatif penyortiran dalam Java Persistence API, untuk entiti sederhana dan juga entiti dalam hubungan satu-ke-banyak. Pendekatan ini memberikan beban kerja penyortiran ke lapisan pangkalan data.

Pelaksanaan Tutorial Penyortiran JPA ini boleh didapati di projek GitHub - ini adalah projek berasaskan Maven, jadi semestinya mudah diimport dan dijalankan sebagaimana adanya.