queryDSL中的正则表达式匹配

时间:2015-11-25 11:43:27

标签: jpa querydsl

我正在尝试进行查询,以便在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 )
            );

2 个答案:

答案 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)会尝试将正则表达式转换为类似形式,并在失败时抛出异常