Menyortir dengan JPA

1. Ikhtisar

Artikel ini mengilustrasikan berbagai cara JPA dapat digunakan untuk penyortiran .

2. Menyortir Dengan JPA / JQL API

Menggunakan JQL untuk mengurutkan dilakukan dengan bantuan klausa Order By :

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

Berdasarkan kueri ini, JPA menghasilkan pernyataan SQL langsung berikut ini :

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

Perhatikan bahwa kata kunci SQL dalam string JQL tidak peka huruf besar kecil, tetapi nama entitas dan atributnya.

2.1. Mengatur Urutan Penyortiran

Secara default , urutan pengurutan adalah menaik , tetapi dapat diatur secara eksplisit dalam string JQL. Seperti pada SQL murni, opsi pengurutannya adalah asc dan desc :

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

The query SQL yang dihasilkan kemudian akan mencakup arah urutan:

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

2.2. Menyortir Berdasarkan Lebih dari Satu Atribut

Untuk mengurutkan berdasarkan beberapa atribut, ini ditambahkan ke perintah berdasarkan klausa dari string JQL:

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

Kedua kondisi pengurutan akan muncul dalam pernyataan kueri 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. Pengaturan Urutan Urutan Nilai Null

Prioritas default nulls adalah khusus database, tetapi ini dapat disesuaikan melalui klausa NULLS FIRST atau NULLS LAST dalam string kueri HQL.

Berikut ini adalah contoh sederhana - pemesanan dengan nama dari Foo dalam urutan dan menempatkan Null s di akhir:

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

Kueri SQL yang dihasilkan menyertakan is null klausa akhir 1 else 0 (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. Menyortir Satu Untuk Banyak Hubungan

Melewati contoh-contoh dasar, sekarang mari kita lihat kasus penggunaan yang melibatkan entitas pengurutan dalam relasi satu ke banyak - Bar yang berisi kumpulan entitas Foo .

Kami ingin mengurutkan entitas Bar dan juga kumpulan entitas Foo mereka - JPA sangat sederhana untuk tugas ini:

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

Perhatikan bahwa anotasi @OrderBy bersifat opsional, tetapi kami menggunakannya dalam kasus ini karena kami ingin mengurutkan koleksi Foo dari setiap Batang .

Mari kita lihat kueri SQL yang dikirim 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 

Kueri pertama mengurutkan entitas Bar induk . Kueri kedua dibuat untuk mengurutkan kumpulan entitas anak Foo milik Bar .

3. Menyortir Dengan API Objek Kueri Kriteria JPA

Dengan Kriteria JPA - metode orderBy adalah alternatif "satu atap" untuk mengatur semua parameter penyortiran: arah pesanan dan atribut yang akan diurutkan dapat disetel. Berikut ini adalah API metode:

  • orderBy ( CriteriaBuilder.asc ): Mengurutkan dalam urutan menaik.
  • orderBy ( CriteriaBuilder.desc ): Mengurutkan dalam urutan menurun.

Setiap instance Order dibuat dengan objek C riteriaBuilder melalui metode asc atau desc-nya .

Berikut ini contoh singkatnya - mengurutkan Foos berdasarkan namanya :

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 ke metode ge t peka huruf besar kecil, karena harus cocok dengan nama atribut.

Berbeda dengan JQL sederhana, API Objek Kueri Kriteria JPA memaksa arah urutan eksplisit dalam kueri. Perhatikan di baris terakhir cuplikan kode ini bahwa objek criteriaBuilder menentukan urutan pengurutan menjadi menaik dengan memanggil metode ascnya .

Ketika kode di atas dijalankan, JPA menghasilkan kueri SQL yang ditunjukkan di bawah ini. 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. Menyortir Berdasarkan Lebih dari Satu Atribut

Untuk mengurutkan berdasarkan lebih dari satu atribut, cukup berikan instance Order ke metode orderBy untuk setiap atribut yang akan diurutkan.

Berikut ini adalah contoh cepat - menyortir oleh nama dan id , di bawah ke atas dan desc ketertiban, 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")));

Kueri SQL terkait ditampilkan di bawah ini:

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 membahas alternatif pengurutan di Java Persistence API, untuk entitas sederhana serta untuk entitas dalam relasi satu-ke-banyak. Pendekatan ini mendelegasikan beban pekerjaan penyortiran ke lapisan database.

Penerapan Tutorial Penyortiran JPA ini dapat ditemukan di proyek GitHub - ini adalah proyek berbasis Maven, jadi semestinya mudah untuk mengimpor dan menjalankannya apa adanya.