我正在尝试进行查询,以便在SQL中重现以下内容:
where REGEXP_LIKE(variable, regular_expression);
我尝试使用匹配谓词和MATCH运算符,但似乎在两种情况下,表达式都转换为类似的 com.mysema.query.types.ExpressionUtils#regexToLike
regexToLike方法将拒绝任何对应于正则表达式语法的'*'或'['并抛出QueryException:
'12 - * 34'无法转换为“
形式
有没有办法在QueryDSL上执行此操作?
编辑: 数据库是Oracle 11G
使用的querydsl库是: com.mysema.querydsl 版本 3.6.9
我将在迁移到 com.querydsl 的最新版本(4)后再次尝试作为sson发布spring数据1.12(querydsl 4支持)。
以下是相关代码:
String telRegex = "";
if (this.tel.length() > 1)
{
char[] chars = this.tel.toCharArray();
telRegex += chars[0];
for (int i = 1; i < chars.length; i++)
{
// NB can't make regex to work as special characters are banned cf. ExpressionUtils.regexToLike
//telRegex += "-*" + chars[i];
telRegex += "" + chars[i];
}
}
else
{
telRegex = rechercheDto.getTelephone();
}
telRegex = "^" + telRegex + "$";
// query
predicate.and($(contact.getTel()).isNotNull())
.and(
$(contact.getTel()).matches(telRegex )
);
答案 0 :(得分:2)
使用REXGEP表达式执行WHERE子句,我使用以下代码
jpaQuery
= jpaQuery
.where
(Expressions.booleanTemplate
("function('REGEXP_LIKE',{0},{1}"
,qTable.ctcTireLineName
,sRegex
)
);
我使用的是QueryDSL 3.7.2。
我刚尝试使用sRegex =“^(EA | SPORT)。*”,它在Java 8中运行良好。
答案 1 :(得分:1)
JPA查询中的模式匹配是使用LIKE
完成的,仅限于%
和_
。查询DSL将尝试将正则表达式转换为LIKE
表达式。
来自StringExpression.matches(String)
某些实现(如Querydsl JPA)会尝试将正则表达式转换为类似形式,并在失败时抛出异常