Запит нечутливий до справи із Spring CrudRepository


102

З запитом Spring CrudRepository; Я хочу вибрати об'єкти "DeviceType" із властивістю "name". Але після запиту виберіть права відповідно до регістру. Як я вважаю, це нечутливий спосіб. Дякую.

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

    public Iterable<DeviceType> findByNameContaining(String name);

}  

16
Ви пробували public Iterable<DeviceType> findByNameIgnoreCaseContaining(String name);?
Пітер Келлер

Якщо вас зацікавив Запит, будь ласка, спробуйте це, Не потрібно вводити "%" після LIKE <code> @Query (value = "виберіть dt з DeviceType як dt, де нижня (dt.name), як нижня (: ім'я)" ) public Iterable <DeviceType> anyMethodNameGoesHere (@Param (name) String name); </code>
Java_Fire_Within

Відповіді:


197

Точно так, як @Peter згадано у коментарі, просто додайте IgnoreCase:

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

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

Перегляньте документацію щодо списку всіх підтримуваних ключових слів у назвах методів.


Велике спасибі за відповідь; впевнений, що я посилаюсь на цю документацію. Дякую. Приємно провести час!
Чанна

3
Це працювало для мене. Я використовував запит JPA. Так, згідно з документацією, де працював UPPER (x.firstame) = UPPER (? 1).
sunitha

@sunitha Чи знаєте ви про будь-який спосіб, як ми могли б змінити таку поведінку, скажімо, зробіть її НИЗКОЮ? Мій db має індексацію на основі нижнього регістру
Судіп Бхандарі,

@SudipBhandari: Звичайно, ти можеш.
sunitha

1
Для кількох властивостей repead IgnoreCaseяк це:List<Account> findByUsernameIgnoreCaseAndDomainIgnoreCase(String username, String domain);
таратор

11

Наступний весняний запит монго для мене працює. Я б вважав за краще використовувати ListзамістьIterator

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

1

У моєму випадку додавання IgnoreCaseвзагалі не працювало.

Я виявив, що також можна надати варіанти для регулярного виразу:

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

Ця iопція робить регістр запиту нечутливим.


1

Для тих, хто використовує спеціальний JPA-запит Верхнє ключове слово та toUpperCase допомагає. Наступний код працює для мене

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

1
Будьте обережні, використовуючи "верхній (q.applicant)". У Postgres це викликає ".PSQLException: ПОМИЛКА: функція верхнього (байт) не існує", коли q.applicant є нульовим
advortsov
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.