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

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.


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

    }

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

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 :)


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

4

Coba ini.

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

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 + "%");


1

jawabannya pasti

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

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!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.