Подтвердить что ты не робот

Hibernate jpa criteriabuilder игнорировать запросы к регистру

Как сделать запрос на игнорирование case с помощью построителя критериев. Для описания свойства я хочу сделать что-то вроде upper(description) like '%xyz%'

У меня есть следующий запрос

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();

    CriteriaQuery<Person> personCriteriaQuery = criteriaBuilder.createQuery(Person.class);
    Root<Person> personRoot = personCriteriaQuery.from(Person.class);

    personCriteriaQuery.select(personRoot);
    personCriteriaQuery.where(criteriaBuilder.like(personRoot.get(Person_.description), "%"+filter.getDescription().toUpperCase()+"%"));
    List<Person> pageResults = entityManager.createQuery(personCriteriaQuery).getResultList();
4b9b3361

Ответ 1

Существует метод CriteriaBuilder.upper():

personCriteriaQuery.where(criteriaBuilder.like(
    criteriaBuilder.upper(personRoot.get(Person_.description)), 
    "%"+filter.getDescription().toUpperCase()+"%"));     

Ответ 2

Если база данных содержит немецкие слова с буквами, такими как Fußballschuhe в столбце, java изменит параметр в верхнем регистре на FUSSBALLSCHUHE и запрос не будет соответствовать. В этом случае работает нижний регистр:

personCriteriaQuery.where(criteriaBuilder.like(
    criteriaBuilder.lower(personRoot.get(Person_.description)), 
    "%"+filter.getDescription().toLowerCase()+"%"));