Zapytanie bez rozróżniania wielkości liter w Spring CrudRepository

102

Z zapytaniem Spring CrudRepository; Chcę wybrać jednostki „DeviceType” z ich właściwością „name”. Ale następujące zapytanie wybierz uprawnienia z uwzględnieniem wielkości liter. Jak sprawiam, że wielkość liter jest niewrażliwa. Dzięki.

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

    public Iterable<DeviceType> findByNameContaining(String name);

}  
Channa
źródło
16
Próbowałeś public Iterable<DeviceType> findByNameIgnoreCaseContaining(String name);?
Peter Keller,
Jeśli jesteś zainteresowany zapytaniem, spróbuj tego, nie musisz podawać '%' po LIKE <kod> @Query (value = "wybierz dt z DeviceType jako dt gdzie niższy (dt.name) jak niższy (: name)" ) public Iterable <DeviceType> anyMethodNameGoesHere (@Param (name) String name); </code>
Java_Fire_Within

Odpowiedzi:

197

Dokładnie tak, jak @Peter wspomniał w komentarzu, wystarczy dodać IgnoreCase:

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

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

Zobacz dokumentację, aby uzyskać listę wszystkich obsługiwanych słów kluczowych w nazwach metod.

Roadrunner
źródło
Bardzo dziękuję za odpowiedź; pewnie odniosę się do tej dokumentacji. Niech dzięki. Baw się dobrze !
Channa
3
U mnie to zadziałało. Używałem zapytania JPA. Więc zgodnie z dokumentacją, gdzie działało UPPER (x.firstame) = UPPER (? 1).
sunitha
@sunitha czy znasz jakiś sposób, w jaki moglibyśmy zmodyfikować to zachowanie, powiedzmy, aby było NIŻSZE? Moja db ma indeksowanie na podstawie małych liter
Sudip Bhandari
@SudipBhandari: Jasne, że możesz.
sunitha
1
Dla wielu nieruchomości powtórz IgnoreCaseto w ten sposób:List<Account> findByUsernameIgnoreCaseAndDomainIgnoreCase(String username, String domain);
Tarator
11

Następujące zapytanie Spring Data Mongo działa dla mnie. Wolałbym użyć ListzamiastIterator

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

źródło
1

W moim przypadku dodawanie w IgnoreCaseogóle nie działało.

Okazało się, że możliwe jest również podanie opcji dla wyrażenia regularnego:

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

Ta iopcja sprawia, że ​​wielkość liter w zapytaniu nie jest uwzględniana.

rocksteady
źródło
1

Dla tych, którzy używają niestandardowego zapytania JPA, pomaga słowo kluczowe Upper i toUpperCase . Poniższy kod działa dla mnie

 return  entityManager.createQuery("select q from "table " q  where upper(q.applicant)=:applicant")
    .setParameter("applicant",applicant.toUpperCase().trim()).getSingleResult();
Dapper Dan
źródło
1
Zachowaj ostrożność podczas używania „upper (q.applicant)”. W Postgres powoduje to `` .PSQLException: ERROR: function upper (bajt) nie istnieje '', gdy q.applicant ma wartość null
advortsov