Запрос без учета регистра с помощью Spring CrudRepository


102

С помощью Spring CrudRepository Query; Я хочу выбрать объекты «DeviceType» с его свойством «name». Но в следующем запросе выберите права с учетом регистра. Как я делаю это без учета регистра. Спасибо.

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

    public Iterable<DeviceType> findByNameContaining(String name);

}  

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

Если вас интересует Query, попробуйте это. Не нужно указывать '%' после LIKE <code> @Query (value = "выберите dt из DeviceType как dt, где lower (dt.name) как lower (: 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);
}  

См. Документацию для списка всех поддерживаемых ключевых слов внутри имен методов.


Большое спасибо за ответ; конечно, я сошлюсь на эту документацию. Спасибо. Желаю хорошо провести время!
Channa

3
У меня это сработало. Я использовал запрос JPA. Итак, согласно документации, где UPPER (x.firstame) = UPPER (? 1) работал.
sunitha

@sunitha знаете ли вы, как мы могли бы изменить это поведение, скажем, сделать его НИЖЕ? Моя база данных имеет индексирование на основе нижнего регистра
Судип Бхандари

@SudipBhandari: Конечно, можешь.
sunitha

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

11

Для меня работает следующий запрос Spring data mongo. Я бы предпочел использовать 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, помогает Upper keyword и 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: ERROR: function upper (bytea) does not exist', когда q.applicant имеет значение null
advortsov
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.