JPA CriteriaQuery - нечувствительный к акценту

Я использую JPA и PostgreSQL и хочу создать CriteriaQuery и создать запрос, в котором акценты не принимаются во внимание.

Пример: если я ищу букву "а", база данных должна возвращать значения "а", "а", "а" и т. Д. Это должно происходить со всеми буквами.

Это пример кода, где я хочу изменить. В этом случае это только регистронезависимый, а не акцент.

    CriteriaBuilder qb = em.getCriteriaBuilder();
    CriteriaQuery query = qb.createQuery(Pessoa.class);

    Root<Pessoa> root = query.from(Pessoa.class);
    query.from(Pessoa.class);
    From from = root;

    Predicate predicate = qb.like(qb.lower(from.get("name")),
            "%" + name+ "%");
    query.where(predicate);

2 ответа

Решение

Я использовал функцию критерия Builder и мог получить то, что хотел. Я только что вызвал qb.function в функции qb.like.

Я сделал это так:

Predicate predicate = qb.like(qb.function("unaccent",         
String.class,qb.lower(from.get("name"))),
"%" + removeAccents(name) + "%");

Использование функции преобразования Oracle с SF7ASCII (Португальский) в качестве параметра:

Predicate p = cb.like(
                    cb.function("convert", String.class, cb.lower(root.get(Api_.name)), cb.literal("SF7ASCII")),
                    "%" + StringUtils.stripAccents(name.toLowerCase()) + "%");

Если вы используете шаблон спецификации, вы можете реализовать решение henriquels, например, путем создания анонимной спецификации и переопределить ее метод toPredicate следующим образом:

public <T> Specification<T> buildUnaccentLikeStringSpecification(StringFilter filter , SingularAttribute<T , String> field) {
    return new Specification<T>() {
        @Override
        public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) 
        {      
            return cb.like(
                    cb.function("unaccent" , String.class , cb.upper(root.get(field)))
                    , toWrapLikeQuery(stripAccents(filter.getContains())
                    )                       
                    );
        }
    };
}
Другие вопросы по тегам