【发布时间】:2015-11-25 11:43:27
【问题描述】:
我正在尝试进行查询以在 SQL 中重现以下内容:
where REGEXP_LIKE(variable, regular_expression);
我尝试使用匹配谓词和 MATCH 运算符,但似乎在这两种情况下,表达式都通过 com.mysema.query.types.ExpressionUtils#regexToLike.
regexToLike 方法将拒绝任何与正则表达式语法对应的 '*' 或 '[' 并抛出 QueryException :
'12-*34'不能转换成like形式"
有没有办法在 QueryDSL 上做到这一点?
编辑: 数据库是Oracle 11G
使用的querydsl库是:com.mysema.querydsl版本3.6.9
我将在迁移到 com.querydsl 的最新版本 (4) 后重试,因为 spring data 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 )
);
【问题讨论】:
-
你用的是什么数据库?
-
您好罗伯特,我使用的是 Oracle 11g
-
你匹配的是字符串吗?我尝试使用 Oracle 11G 调用
StringExpression'spublic BooleanExpression matches(String regex)并且要显示的 SQL 是regexp_like。代码看起来像where(tableName.columnThatsAString.matches("^foo$")) -
如果这没有帮助,我们可以获取您正在使用的 querydsl 版本和代码吗?
-
@RobertBain 添加了编辑中使用的版本。我尝试了一个和你一样的查询,得到:com.mysema.query.QueryException: '^0493$' can't be convert to like form