Kueri JPA Data Musim Semi dengan Contoh

1. Perkenalan

Dalam tutorial ini, kita akan mempelajari cara membuat kueri data dengan Kueri Data Musim Semi dengan API Contoh .

Pertama, kami akan menentukan skema data yang ingin kami kueri. Selanjutnya, kita akan memeriksa beberapa kelas yang relevan dari Data Musim Semi. Dan kemudian, kita akan membahas beberapa contoh.

Ayo mulai!

2. Data Uji

Data pengujian kami adalah daftar nama penumpang serta kursi yang mereka tempati.

Nama depan Nama keluarga Nomor kursi
Jill Smith 50
Malam Jackson 94
Fred Bloggs 22
Ricki Bobbie 36
Siya Kolisi 85

3. Domain

Mari buat Spring Data Repository yang kita butuhkan dan berikan kelas domain dan tipe id kita.

Pertama-tama, kami telah membuat model Penumpang kami sebagai entitas JPA:

@Entity class Passenger { @Id @GeneratedValue @Column(nullable = false) private Long id; @Basic(optional = false) @Column(nullable = false) private String firstName; @Basic(optional = false) @Column(nullable = false) private String lastName; @Basic(optional = false) @Column(nullable = false) private int seatNumber; // constructor, getters etc. }

Alih-alih menggunakan JPA, kami dapat memodelkannya sebagai abstraksi lain.

4. Pertanyaan dengan Contoh API

Pertama, mari kita lihat antarmuka JpaRepository . Seperti yang dapat kita lihat, ini memperluas antarmuka QueryByExampleExecutor untuk mendukung kueri dengan contoh:

public interface JpaRepository extends PagingAndSortingRepository, QueryByExampleExecutor {}

Antarmuka ini memperkenalkan lebih banyak varian metode find () yang kami kenal dari Spring Data. Namun, setiap metode juga menerima contoh Contoh :

public interface QueryByExampleExecutor {  Optional findOne(Example var1);  Iterable findAll(Example var1);  Iterable findAll(Example var1, Sort var2);  Page findAll(Example var1, Pageable var2);  long count(Example var1);  boolean exists(Example var1); }

Kedua, antarmuka Contoh memperlihatkan metode untuk mengakses probe dan ExampleMatcher .

Penting untuk disadari bahwa probe adalah instance dari Entitas kita :

public interface Example { static  org.springframework.data.domain.Example of(T probe) { return new TypedExample(probe, ExampleMatcher.matching()); } static  org.springframework.data.domain.Example of(T probe, ExampleMatcher matcher) { return new TypedExample(probe, matcher); } T getProbe(); ExampleMatcher getMatcher(); default Class getProbeType() { return ProxyUtils.getUserClass(this.getProbe().getClass()); } }

Singkatnya, probe dan ExampleMatcher kita bersama-sama menentukan kueri kita.

5. Batasan

Seperti semua hal lainnya, Query by Example API memiliki beberapa batasan. Misalnya:

  • Pernyataan bersarang dan pengelompokan tidak didukung, misalnya: ( firstName =? 0 dan lastName =? 1) atau seatNumber =? 2
  • Pencocokan string hanya mencakup tepat, tidak peka huruf besar / kecil, awal, akhir, berisi, dan ekspresi reguler
  • Semua jenis selain String hanya pencocokan tepat

Sekarang setelah kita sedikit lebih akrab dengan API dan batasannya, mari selami beberapa contoh.

6. Contoh

6.1. Pencocokan Peka Huruf Besar-Kecil

Mari kita mulai dengan contoh sederhana dan berbicara tentang perilaku default:

@Test public void givenPassengers_whenFindByExample_thenExpectedReturned() { Example example = Example.of(Passenger.from("Fred", "Bloggs", null)); Optional actual = repository.findOne(example); assertTrue(actual.isPresent()); assertEquals(Passenger.from("Fred", "Bloggs", 22), actual.get()); }

Secara khusus, metode Example.of () statis membuat Contoh menggunakan ExampleMatcher.matching () .

Dengan kata lain, yang sama persis akan dilakukan pada semua properti non-null dari Penumpang . Jadi, pencocokan peka huruf besar kecil pada properti String .

Namun, itu tidak akan terlalu berguna jika yang bisa kami lakukan hanyalah pencocokan tepat pada semua properti bukan-null.

Di sinilah ExampleMatcher berperan . Dengan membangun ExampleMatcher sendiri , kita dapat menyesuaikan perilaku agar sesuai dengan kebutuhan kita.

6.2. Pencocokan Tidak Peka Huruf Besar-Kecil

Dengan mengingat hal itu, mari kita lihat contoh lain, kali ini menggunakan withIgnoreCase () untuk mencapai pencocokan tidak peka huruf besar / kecil:

@Test public void givenPassengers_whenFindByExampleCaseInsensitiveMatcher_thenExpectedReturned() { ExampleMatcher caseInsensitiveExampleMatcher = ExampleMatcher.matchingAll().withIgnoreCase(); Example example = Example.of(Passenger.from("fred", "bloggs", null), caseInsensitiveExampleMatcher); Optional actual = repository.findOne(example); assertTrue(actual.isPresent()); assertEquals(Passenger.from("Fred", "Bloggs", 22), actual.get()); }

Dalam contoh ini, perhatikan bahwa kita pertama kali memanggil ExampleMatcher.matchingAll () - ini memiliki perilaku yang sama seperti ExampleMatcher.matching () , yang kita gunakan pada contoh sebelumnya.

6.3. Pencocokan Kustom

Kita juga bisa menyesuaikan perilaku matcher kita per properti dan mencocokkan properti apa pun menggunakan ExampleMatcher.matchingAny () :

@Test public void givenPassengers_whenFindByExampleCustomMatcher_thenExpectedReturned() { Passenger jill = Passenger.from("Jill", "Smith", 50); Passenger eve = Passenger.from("Eve", "Jackson", 95); Passenger fred = Passenger.from("Fred", "Bloggs", 22); Passenger siya = Passenger.from("Siya", "Kolisi", 85); Passenger ricki = Passenger.from("Ricki", "Bobbie", 36); ExampleMatcher customExampleMatcher = ExampleMatcher.matchingAny() .withMatcher("firstName", ExampleMatcher.GenericPropertyMatchers.contains().ignoreCase()) .withMatcher("lastName", ExampleMatcher.GenericPropertyMatchers.contains().ignoreCase()); Example example = Example.of(Passenger.from("e", "s", null), customExampleMatcher); List passengers = repository.findAll(example); assertThat(passengers, contains(jill, eve, fred, siya)); assertThat(passengers, not(contains(ricki))); }

6.4. Mengabaikan Properti

Di sisi lain, kami mungkin juga hanya ingin melakukan kueri pada subset properti kami .

Kami mencapai ini dengan mengabaikan beberapa properti menggunakan ExampleMatcher.ignorePaths (String… jalur) :

@Test public void givenPassengers_whenFindByIgnoringMatcher_thenExpectedReturned() { Passenger jill = Passenger.from("Jill", "Smith", 50); Passenger eve = Passenger.from("Eve", "Jackson", 95); Passenger fred = Passenger.from("Fred", "Bloggs", 22); Passenger siya = Passenger.from("Siya", "Kolisi", 85); Passenger ricki = Passenger.from("Ricki", "Bobbie", 36); ExampleMatcher ignoringExampleMatcher = ExampleMatcher.matchingAny() .withMatcher("lastName", ExampleMatcher.GenericPropertyMatchers.startsWith().ignoreCase()) .withIgnorePaths("firstName", "seatNumber"); Example example = Example.of(Passenger.from(null, "b", null), ignoringExampleMatcher); List passengers = repository.findAll(example); assertThat(passengers, contains(fred, ricki)); assertThat(passengers, not(contains(jill)); assertThat(passengers, not(contains(eve)); assertThat(passengers, not(contains(siya)); }

7. Kesimpulan

Di artikel ini, kami telah mendemonstrasikan cara menggunakan Query by Example API.

Kami telah mendemonstrasikan cara menggunakan Example dan ExampleMatcher bersama dengan antarmuka QueryByExampleExecutor untuk membuat kueri tabel menggunakan contoh data contoh.

Kesimpulannya, Anda dapat menemukan kodenya di GitHub.