Запрос без учета регистра с помощью 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
Это может вам помочь, stackoverflow.com/questions/37178520/jpql-like-case-insensitive/…
Шашанк,

Ответы:

197

Точно так же, как @Peter упомянул в комментарии, просто добавьте IgnoreCase:

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

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

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

Roadrunner
источник
Большое спасибо за ответ; конечно, я сошлюсь на эту документацию. Спасибо. Желаю хорошо провести время!
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опция делает запрос без учета регистра.

Rock Steady
источник
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