Kaedah Pertanyaan Berasal di Repositori JPA Data Spring

1. Pengenalan

Untuk pertanyaan yang mudah, mudah untuk mengetahui apakah pertanyaan itu hanya dengan melihat nama kaedah yang sesuai dalam kod kami.

Dalam tutorial ini, kita akan menerangkan bagaimana Spring Data JPA memanfaatkan idea ini dalam bentuk kaedah penamaan kaedah.

2. Struktur Kaedah Pertanyaan Berasal pada Musim Bunga

Nama kaedah turunan mempunyai dua bahagian utama yang dipisahkan dengan yang pertama Dengan kata kunci:

List findByName(String name)

Bahagian pertama - seperti find - adalah pencadang dan lain - seperti Byname - adalah kriteria.

Spring Data JPA menyokong mencari, membaca, membuat pertanyaan, mengira dan mendapatkan . Jadi, sebagai contoh, kita boleh melakukan queryByName dan Spring Data akan berkelakuan sama.

Kami juga dapat menggunakan Distinct, First, atau Top untuk membuang pendua atau menghadkan set hasil kami:

List findTop3ByAge()

Bahagian kriteria mengandungi ungkapan keadaan khusus bagi entiti. Kami boleh menggunakan kata kunci syarat bersama dengan nama harta entiti. Kami juga dapat menggabungkan ungkapan dengan And dan Or, serta melihat dalam sekejap sahaja.

3. Contoh Permohonan

Pertama, kita tentu memerlukan aplikasi yang menggunakan Spring Data JPA.

Dalam aplikasi itu, mari kita tentukan kelas entiti:

@Table(name = "users") @Entity class User { @Id @GeneratedValue private Integer id; private String name; private Integer age; private ZonedDateTime birthDate; private Boolean active; // standard getters and setters }

Dan, mari kita tentukan repositori. Ia akan meluaskan JpaRepository, salah satu jenis Spring Data Repository:

interface UserRepository extends JpaRepository {}

Di sinilah kita akan meletakkan semua kaedah pertanyaan yang diperoleh.

4. Kata Kunci Keadaan Persamaan

Persamaan tepat adalah salah satu syarat yang paling kerap digunakan dalam pertanyaan. Kami mempunyai beberapa pilihan untuk menyatakan = atau operator IS dalam pertanyaan.

Kami hanya boleh menambahkan nama harta tanpa kata kunci untuk keadaan pencocokan tepat:

List findByName(String name);

Dan kita boleh menambah Is atau Sama untuk keterbacaan:

List findByNameIs(String name); List findByNameEquals(String name);

Kebolehbacaan tambahan ini sangat berguna apabila kita perlu menyatakan ketaksamaan:

List findByNameIsNot(String name);

Ini agak lebih mudah dibaca daripada findByNameNot (String) !

Oleh kerana kesetaraan nol adalah kes khas, kita tidak boleh menggunakan operator =. Spring Data JPA mengendalikan parameter null secara lalai. Oleh itu, apabila kita melepasi nilai nol untuk keadaan kesamaan, Spring menafsirkan pertanyaan sebagai IS NULL dalam SQL yang dihasilkan.

Kami juga boleh menggunakan kata kunci IsNull untuk menambahkan kriteria IS NULL ke pertanyaan:

List findByNameIsNull(); List findByNameIsNotNull();

Perhatikan bahawa, baik IsNull atau IsNotNull tidak memerlukan argumen kaedah.

Terdapat juga dua kata kunci lagi yang tidak memerlukan argumen. Kita boleh menggunakan kata kunci Betul dan Salah untuk menambahkan syarat persamaan untuk jenis boolean :

List findByActiveTrue(); List findByActiveFalse();

Sudah tentu, kadang-kadang kita menginginkan sesuatu yang lebih ringan daripada persamaan yang tepat, mari kita lihat apa lagi yang boleh kita lakukan.

5. Kata Kunci Keadaan Kesamaan

Apabila kita perlu meminta hasil dengan corak harta tanah, kita mempunyai beberapa pilihan.

Kita dapat mencari nama yang bermula dengan nilai menggunakan StartWith :

List findByNameStartingWith(String prefix);

Secara kasar, ini diterjemahkan menjadi "DI MANA nama SEPERTI 'nilai%' ".

Sekiranya kita mahukan nama yang diakhiri dengan nilai, maka EndingWith adalah yang kita mahukan:

List findByNameEndingWith(String suffix);

Atau, kita dapat mencari nama mana yang mengandungi nilai dengan Mengandungi :

List findByNameContaining(String infix);

Perhatikan bahawa semua keadaan di atas disebut ungkapan corak yang telah ditentukan. Oleh itu, kita tidak perlu menambahkan % operator di dalam argumen ketika kaedah ini dipanggil.

Tetapi, anggaplah kita melakukan sesuatu yang lebih kompleks. Katakanlah kita perlu mengambil pengguna yang namanya dimulai dengan a , mengandung b, dan diakhiri dengan c.

Untuk itu, kita boleh menambahkan LIKE kita sendiri dengan kata kunci Suka :

List findByNameLike(String likePattern);

Kami kemudian boleh menyerahkan corak LIKE kami apabila kami memanggil kaedah:

String likePattern = "a%b%c"; userRepository.findByNameLike(likePattern);

Sudah cukup untuk nama sekarang. Mari cuba beberapa nilai lain dalam Pengguna.

6. Kata Kunci Keadaan Perbandingan

Tambahan pula, kita boleh menggunakan lessthan dan LessThanEqual kata kunci untuk membandingkan rekod dengan nilai yang diberikan menggunakan < dan <= pengendali:

List findByAgeLessThan(Integer age); List findByAgeLessThanEqual(Integer age);

On the other hand, in the opposite situation, we can use GreaterThan and GreaterThanEqual keywords:

List findByAgeGreaterThan(Integer age); List findByAgeGreaterThanEqual(Integer age);

Or, we can find users who are between two ages with Between:

List findByAgeBetween(Integer startAge, Integer endAge);

We can also supply a collection of ages to match against using In:

List findByAgeIn(Collection ages);

Since we know the users' birthdates, we might want to query for users who were born before or after a given date. We'd use Before and After for that:

List findByBirthDateAfter(ZonedDateTime birthDate); List findByBirthDateBefore(ZonedDateTime birthDate);

7. Multiple Condition Expressions

We can combine as many expressions as we need by using And and Or keywords:

List findByNameOrBirthDate(String name, ZonedDateTime birthDate); List findByNameOrBirthDateAndActive(String name, ZonedDateTime birthDate, Boolean active);

The precedence order is And then Or, just like Java.

While Spring Data JPA imposes no limit to how many expressions we can add, we shouldn't go crazy here. Long names are unreadable and hard to maintain. For complex queries, take a look at the @Query annotation instead.

8. Sorting the Results

Next up is sorting. We could ask that the users be sorted alphabetically by their name using OrderBy:

List findByNameOrderByName(String name); List findByNameOrderByNameAsc(String name);

Ascending order is the default sorting option, but we can use Desc instead to sort them in reverse:

List findByNameOrderByNameDesc(String name);

9. findOne vs findById in a CrudRepository

The Spring team made some major changes in CrudRepository with Spring Boot 2.x. One of them is renaming findOne to findById.

Previously with Spring Boot 1.x, we'd call findOne when we wanted to retrieve an entity by its primary key:

User user = userRepository.findOne(1);

Since Spring Boot 2.x we can do the same with findById:

User user = userRepository.findById(1);

Note that the findById() method is already defined in CrudRepository for us. So we don't have to define it explicitly in custom repositories that extend CrudRepository.

10. Conclusion

Dalam artikel ini, kami menerangkan mekanisme derivasi pertanyaan dalam Spring Data JPA. Kami menggunakan kata kunci keadaan harta tanah untuk menulis kaedah pertanyaan yang diperoleh di repositori Spring Data JPA.

Kod sumber tutorial ini terdapat pada projek Github.