% Suka% Kueri di musim semi JpaRepository

110

Saya ingin menulis kueri serupa JpaRepositorytetapi tidak mengembalikan apa pun:

LIKE '%place%'-ini tidak bekerja.

LIKE 'place' bekerja dengan sempurna.

Ini kode saya:

@Repository("registerUserRepository")
public interface RegisterUserRepository extendsJpaRepository<Registration,Long> {

    @Query("Select c from Registration c where c.place like :place")
     List<Registration> findByPlaceContaining(@Param("place")String place);
}
sudeep cv
sumber

Jawaban:

199

Kueri JPA data musim semi membutuhkan karakter "%" serta spasi setelah likekueri Anda, seperti pada

@Query("Select c from Registration c where c.place like %:place%").

Cf. http://docs.spring.io/spring-data/jpa/docs/current/reference/html .

Anda mungkin ingin menyingkirkan semua @Queryanotasi secara bersamaan, karena tampaknya mirip dengan kueri standar (diterapkan secara otomatis oleh proxy data pegas); yaitu menggunakan satu baris

List<Registration> findByPlaceContaining(String place);

Cukup.

Hille
sumber
23
Mungkin berguna juga untuk mengabaikan kasus untuk kueri, menggunakan: findByPlaceIgnoreCaseContaining (String place);
ilyailya
Sama seperti komentar sampingan - Anda tidak dapat mencampur dan mencocokkan%: param% dengan% param% di dalam kueri yang sama. Jika tidak, aplikasi bahkan tidak akan mulai.
RVP
Terima kasih. Saya biasa menulis like '%:place%'dengan 'dan tidak ada hasil sama sekali, karena Hibernate menambahkan 's ke string dengan sendirinya.
Yamashiro Rion
Ini bukan respons yang baik dan berpotensi berbahaya juga. Spring telah menyelesaikannya dengan ContainingIgnoreCase, periksa jawaban saya di bawah.
Alexius DIAKOGIANNIS
99

Anda sebenarnya tidak memerlukan @Queryanotasi sama sekali.

Anda bisa menggunakan yang berikut ini

    @Repository("registerUserRepository")
    public interface RegisterUserRepository extends JpaRepository<Registration,Long>{

    List<Registration> findByPlaceIgnoreCaseContaining(String place);

    }
Alexius DIAKOGIANNIS
sumber
Bagi saya ini adalah solusi terbaik. saya tidak tahu Anda dapat menggunakan IgnoreCase dikombinasikan dengan Mengandung, Itu tidak ada dalam dokumentasi.
Wilson Campusano
1
Bagaimana dengan kasus ketika saya ingin menggunakan banyak kolom? - Saya percaya @Query()itu suatu keharusan, bukan? Dengan pendekatan itu, saya harus membuat oritu sebenarnya bukan solusi yang cocok untuk kasus itu:findByField1OrField2Containg(String phraseForField1, String phraseForField2)
user3529850
26

Anda juga dapat menerapkan kueri serupa menggunakan kata kunci yang didukung JPA Spring Data "Berisi" .

List<Registration> findByPlaceContaining(String place);
amanzoor
sumber
20

Untuk kasus Anda, Anda dapat langsung menggunakan metode JPA. Itu seperti di bawah ini:

Berisi: pilih ... like%: place%

List<Registration> findByPlaceContainingIgnoreCase(String place);

Di sini, IgnoreCase akan membantu Anda untuk mencari item dengan mengabaikan case.

Menggunakan @Query di JPQL :

@Query("Select registration from Registration registration where 
registration.place LIKE  %?1%")
List<Registration> findByPlaceContainingIgnoreCase(String place);

Berikut beberapa metode terkait:

  1. Suka findByPlaceLike

    … Dimana x.place seperti? 1

  2. Dimulai dengan findByPlaceStartingWith

    … Dimana x.place seperti? 1 (parameter terikat dengan% tambahan)

  3. EndingWith findByPlaceEndingWith

    … Di mana x.place seperti? 1 (parameter terikat dengan% diawali)

  4. Mengandung findByPlaceContaining

    … Di mana x.place seperti? 1 (parameter terikat dibungkus dalam%)

Info lebih lanjut, lihat tautan ini , tautan ini dan ini

Semoga ini bisa membantu Anda :)

Md. Sajedul Karim
sumber
6

Anda dapat memiliki satu alternatif untuk menggunakan placeholder sebagai:

@Query("Select c from Registration c where c.place LIKE  %?1%")
List<Registration> findPlaceContainingKeywordAnywhere(String place);
Nitin Pawar
sumber
4

Coba ini.

@Query("Select c from Registration c where c.place like '%'||:place||'%'")
Ashu
sumber
Bermanfaat jika kita menggunakan something=:placedan another like %:place%di query.
hong4rc
1

saat panggilan funtion, saya menggunakan: findByPlaceContaining("%" + place);

atau: findByPlaceContaining(place + "%");

atau: findByPlaceContaining("%" + place + "%");

pengguna9290654
sumber
1

jawabannya pasti

-> `@Query (" pilih u dari Category u dimana u.categoryName seperti%: input% ")
     Daftar findAllByInput (@Param ("input") String input);
Sulaymon Hursanov
sumber
0

Menemukan solusi tanpa @Query (sebenarnya saya mencoba yang mana yang "diterima". Namun, tidak berhasil).

Harus kembali, Page<Entity>bukan List<Entity>:

public interface EmployeeRepository 
                          extends PagingAndSortingRepository<Employee, Integer> {
    Page<Employee> findAllByNameIgnoreCaseStartsWith(String name, Pageable pageable);
}

IgnoreCase bagian sangat penting untuk mencapai ini!

nazar_art
sumber