Pertanyaan JPA Spring Data dengan Contoh

1. Pengenalan

Dalam tutorial ini, kita akan belajar bagaimana membuat kueri data dengan Spring Data Query oleh Contoh API .

Pertama, kami akan menentukan skema data yang ingin kami tanyakan. Seterusnya, kami akan memeriksa beberapa kelas yang berkaitan dari Spring Data. Dan kemudian, kita akan melalui beberapa contoh.

Mari kita mulakan!

2. Data Ujian

Data ujian kami adalah senarai nama penumpang dan juga tempat duduk yang mereka duduki.

Nama pertama Nama terakhir Nombor tempat duduk
Jill Smith 50
Hawa Jackson 94
Fred Blogg 22
Ricki Bobbie 36
Siya Kolisi 85

3. Domain

Mari buat Spring Data Repository yang kami perlukan dan berikan kelas domain dan jenis id kami.

Sebagai permulaan, kami telah memodelkan Penumpang kami sebagai entiti 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. }

Daripada menggunakan JPA, kita mungkin menjadikannya sebagai abstraksi yang lain.

4. Pertanyaan mengikut Contoh API

Pertama, mari kita lihat antara muka JpaRepository . Seperti yang kita lihat, ia memperluas antara muka QueryByExampleExecutor untuk menyokong pertanyaan dengan contoh:

public interface JpaRepository extends PagingAndSortingRepository, QueryByExampleExecutor {}

Antaramuka ini memperkenalkan lebih banyak varian kaedah find () yang kita kenal dengan Spring Data. Namun, setiap kaedah 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, antara muka Contoh mendedahkan kaedah untuk mengakses probe dan ContohMatcher .

Penting untuk menyedari bahawa siasatan adalah contoh Entiti kami :

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()); } }

Ringkasnya, siasatan kami dan ContohMatcher kami bersama-sama menentukan pertanyaan kami.

5. Batasan

Seperti semua perkara, API Permintaan demi Contoh mempunyai beberapa batasan. Contohnya:

  • Penyataan bersarang dan mengelompokkan tidak disokong, contohnya: ( nama pertama =? 0 dan nama belakang =? 1) atau tempat duduk =? 2
  • Pencocokan tali hanya merangkumi tepat, tidak peka huruf besar, permulaan, akhir, mengandungi, dan regex
  • Semua jenis selain String adalah padanan tepat sahaja

Sekarang setelah kita lebih memahami API dan batasannya, mari kita selami beberapa contoh.

6. Contohnya

6.1. Pemadanan Sensitif Kes

Mari kita mulakan dengan contoh mudah dan bercakap mengenai tingkah laku lalai:

@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()); }

Khususnya, statik Example.of () kaedah membina sebuah Contoh menggunakan ExampleMatcher.matching () .

Dengan kata lain, padanan yang tepat akan dilaksanakan ke atas semua harta bukan null- daripada penumpang . Oleh itu, pemadanan peka huruf besar-kecil pada sifat String .

Namun, tidak akan berguna jika semua yang dapat kita lakukan adalah padanan tepat pada semua harta tanah yang tidak kosong.

Di sinilah ContohMatcher masuk. Dengan membina ContohMatcher kita sendiri , kita dapat menyesuaikan tingkah laku agar sesuai dengan keperluan kita.

6.2. Pemadanan Tidak Sensitif Kes

Dengan ini, mari kita lihat contoh lain, kali ini menggunakan withIgnoreCase () untuk mencapai padanan huruf besar-sensitif:

@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 bahawa kami pertama kali memanggil ContohMatcher.matchingAll () - ia mempunyai tingkah laku yang sama dengan ContohMatcher.matching () , yang kami gunakan dalam contoh sebelumnya.

6.3. Pencocokan Khusus

Kami juga dapat menyesuaikan tingkah laku penjodoh kami berdasarkan harta tanah dan memadankan sebarang harta tanah menggunakan ContohMatcher.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 Sifat

Sebaliknya, kami mungkin hanya ingin membuat pertanyaan mengenai subkumpulan harta tanah kami .

Kami mencapainya dengan mengabaikan beberapa sifat menggunakan ContohMatcher.ignorePaths (String… paths) :

@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. Kesimpulannya

Dalam artikel ini, kami telah menunjukkan cara menggunakan Query by Contoh API.

Kami telah menunjukkan cara menggunakan Contoh dan ContohMatcher bersama antara muka QueryByExampleExecutor untuk membuat pertanyaan jadual menggunakan contoh data contoh.

Sebagai kesimpulan, anda boleh mendapatkan kod di GitHub.