JPA CriteriaQuery - 不区分重音

Posted

技术标签:

【中文标题】JPA CriteriaQuery - 不区分重音【英文标题】:JPA CriteriaQuery - accent insensitive 【发布时间】:2016-01-20 19:36:51 【问题描述】:

我正在使用 JPA 和 PostgreSQL,我想创建一个 CriteriaQuery 并创建一个查询 不考虑口音的地方。

示例: 如果我搜索字母“a”,数据库应该返回值“ã”、“a”、“á”等。这应该发生在所有字母上。

这是我要更改的代码示例。在这种情况下,它只是不区分大小写,而不是重音。

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

【问题讨论】:

我希望能够像这样:SELECT * FROM person WHERE unaccent(name) LIKE unaccent('%JOÃO%') using CriteriaQuery 所以使用 CriteriaBuilder.function 来调用“unaccent”(无论那个 SQL 函数是什么)。使您的代码数据库依赖,但是对于这样的事情,您可能总是会 【参考方案1】:

我使用了criteriaBuilder的功能,可以得到我想要的。我只是在 qb.like 函数中调用了 qb.function。

我是这样做的:

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

【讨论】:

【参考方案2】:

使用SF7ASCII(葡萄牙语)作为参数的Oracle转换函数:

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

【讨论】:

以上是关于JPA CriteriaQuery - 不区分重音的主要内容,如果未能解决你的问题,请参考以下文章

日期之间的 JPA 2.1 CriteriaQuery

如何将 JPA 调整为 Criteriaquery

向 JPA CriteriaQuery 添加连接

CriteriaQuery JPA 2 问题与结果

JPA CriteriaQuery 多对多谓词

PostgreSQL 是不是支持“不区分重音”排序规则?