【问题标题】:Regular expression matching in queryDSLqueryDSL 中的正则表达式匹配
【发布时间】: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's public 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

标签: jpa querydsl


【解决方案1】:

要使用 REXGEP 表达式执行 WHERE 子句,我使用以下代码

jpaQuery 
  = jpaQuery
      .where
        (Expressions.booleanTemplate
          ("function('REGEXP_LIKE',{0},{1}"
          ,qTable.ctcTireLineName
          ,sRegex
          )
        );

我使用 QueryDSL 3.7.2。

我刚刚尝试使用 sRegex = "^(EA|SPORT).*",它在 Java 8 中运行良好。

【讨论】:

    【解决方案2】:

    JPA 查询中的模式匹配使用LIKE 完成,并且仅限于% 和_。 Query DSL 会尝试将您的正则表达式转换为LIKE 表达式。

    来自StringExpression.matches(String)的文档

    Querydsl JPA 等一些实现会尝试将正则表达式转换为类似的形式,并在失败时抛出异常

    【讨论】:

    • 对我来说,解决方案是做一个近似的LIKE,然后用String.matches(String)在java中过滤结果
    • 你是对的,谢谢。但是,对于解决方法,请参阅 schlebe 的评论 (7/04) github.com/querydsl/querydsl/issues/1713
    猜你喜欢
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 2011-05-01
    相关资源
    最近更新 更多