Kueri tidak peka huruf besar / kecil dengan Spring CrudRepository


102

Dengan Spring CrudRepository Query; Saya ingin memilih entitas "DeviceType" dengan properti "name" -nya. Tetapi kueri berikut memilih judul dengan cara yang peka huruf besar / kecil. Bagaimana saya membuatnya menjadi case insensitive. Terima kasih.

public interface DeviceTypeRepository extends CrudRepository<DeviceType, Integer>, JpaSpecificationExecutor<DeviceType> {

    public Iterable<DeviceType> findByNameContaining(String name);

}  

16
Apakah kamu sudah mencobanya public Iterable<DeviceType> findByNameIgnoreCaseContaining(String name);?
Peter Keller

Jika Anda tertarik dengan Query maka silakan coba ini, Tidak perlu memberikan '%' setelah LIKE <code> @Query (value = "pilih dt dari DeviceType as dt where lower (dt.name) like lower (: name)" ) public Iterable <DeviceType> anyMethodNameGoesHere (@Param (name) String name); </code>
Java_Fire_Within

Jawaban:


197

Persis seperti @Peter yang disebutkan dalam komentar, tambahkan saja IgnoreCase:

public interface DeviceTypeRepository 
    extends CrudRepository<DeviceType, Integer>, JpaSpecificationExecutor<DeviceType> {

    public Iterable<DeviceType> findByNameContainingIgnoreCase(String name);
}  

Lihat dokumentasi untuk daftar semua kata kunci yang didukung di dalam nama metode.


Terima kasih banyak atas jawabannya; tentu saya akan merujuk dokumentasi itu. Semoga Terima Kasih. Selamat bersenang-senang!
Channa

3
Itu berhasil untuk saya. Saya menggunakan kueri JPA. Sesuai dengan dokumentasi, di mana UPPER (x.firstame) = UPPER (? 1) bekerja.
sunitha

@sunitha, apakah Anda tahu cara apa pun yang dapat kami lakukan untuk mengubah perilaku ini, misalnya buat RENDAH? DB saya memiliki pengindeksan berdasarkan huruf kecil
Sudip Bhandari

@SudipBhandari: Tentu kamu bisa.
sunitha

1
Untuk beberapa properti, baca ulang IgnoreCaseseperti ini:List<Account> findByUsernameIgnoreCaseAndDomainIgnoreCase(String username, String domain);
Tarator

11

Kueri mongo data Spring berikut berfungsi untuk saya. Saya lebih suka menggunakan ListdaripadaIterator

public interface DeviceTypeRepository extends CrudRepository<DeviceType,Integer>, JpaSpecificationExecutor<DeviceType> {
    List<DeviceType> findByNameIgnoreCase(String name);
} 

1

Dalam kasus saya, penambahan IgnoreCasetidak berhasil sama sekali.

Saya menemukan bahwa dimungkinkan untuk memberikan opsi untuk ekspresi reguler, juga:

@Query(value = "{'title': {$regex : ?0, $options: 'i'}}")
Foo findByTitleRegex(String regexString);

The ipilihan membuat query case-sensitive.


1

Bagi mereka yang menggunakan permintaan JPA kustom Kata kunci atas dan bantuan toUpperCase . Kode berikut berfungsi untuk saya

 return  entityManager.createQuery("select q from "table " q  where upper(q.applicant)=:applicant")
    .setParameter("applicant",applicant.toUpperCase().trim()).getSingleResult();

1
Hati-hati saat menggunakan 'upper (q.applicant)'. Di Postgres itu menyebabkan '.PSQLException: ERROR: function upper (bytea) tidak ada' ketika q.applicant adalah null
advortsov
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.