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())
)
);
}
};
}