我想用变音符号在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
有人可以提出一些建议吗?
答案 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)支持语言搜索,然后,无需更改我的代码。