如何在querydsl中使用oracle REGEXP_LIKE()?

时间:2017-02-08 08:00:02

标签: java oracle querydsl

我想用变音符号在Oracle数据库中搜索字符串,即:输入“o”然后搜索“o”以及“o”,“ö”或“ô”。
我可以使用基本字母操作符[==]在本机SQL中使用REGEXP_LIKE()函数执行此操作:

where REGEXP_LIKE(<column_name>,'[[=o=]]') 

但是,现在,我不知道如何使用QueryDSL。我尝试了解决方案@ https://github.com/querydsl/querydsl/issues/1713,但它没有成功。

目前的代码如下:

return new JPAQuery<AEntity>(em)
            .from(QAEntity.aEntity)
            .where(Expressions.booleanTemplate("REGEXP_LIKE({0}, {1})", QAEntity.aEntity.name, "[[=o=]]"))
            .orderBy(QAEntity.aEntity.name.asc())
            .fetch();

它会抛出异常:

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: ( near line 3, column 18 [select aEntity
from domain.AEntity aEntity
where REGEXP_LIKE(aEntity.name, ?1)
order by aEntity.name asc]
    at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74)
    at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:91)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:268)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:190)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:142)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:115)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:76)
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:150)
    at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:302)
    at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:240)
    at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1894)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:291)
    ... 123 common frames omitted

有人可以提出一些建议吗?

2 个答案:

答案 0 :(得分:1)

您忘记了{1}

附近的引语

它应该像

return new JPAQuery<AEntity>(em)
            .from(QAEntity.aEntity)
            .where(Expressions.booleanTemplate("REGEXP_LIKE({0}, '{1}')", QAEntity.aEntity.name, "[[=o=]]"))
            .orderBy(QAEntity.aEntity.name.asc())
            .fetch();

EDIT。我发现如果你需要使用regexp_like,你应该指定下一个

(Expressions.booleanTemplate
                ("function('REGEXP_LIKE', {0}, {1})", QAEntity.aEntity.name, "[[=o=]]"))

答案 1 :(得分:0)

对于那些遇到同样问题的人:我的最终解决方案是配置DB&amp;服务器(在我的情况下是JBoss)支持语言搜索,然后,无需更改我的代码。