% 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.