【问题标题】:JPA: Equivalent for Oracle's REGEXP_SUBSTRJPA:相当于 Oracle 的 REGEXP_SUBSTR
【发布时间】:2014-10-02 10:58:57
【问题描述】:

我有以下 Oracle SQL 查询:

SELECT SUBSTR(col, 0, INSTR(col, REGEXP_SUBSTR(col, '\.\d+$')) -1) AS col_new, col as col_orig AS col_orig FROM tab;

我的表格中有如下数据:

col
ABC.A.01
ABC.A.02

以上查询返回如下结果:

col_new  col_orig
ABC.A    ABC.A.01
ABC.A    ABC.A.02

我正在尝试将其迁移到 JPA 命名查询。到现在我只能这样查询:

SELECT SUBSTRING(f.col, 0, LENGTH(f.col) - LOCATE('.', REVERSE(f.col))), f.col FROM tab f;

我这样做是因为我无法在 JPA 中为 Oracle 的 REGEXP_SUBSTR 找到等效项。我的 JPA 命名查询在 ABC.A.P01 等数据示例中失败。

您能否告诉我如何使用 REGEXP_SUBSTR 的等效项将我的 SQL 查询迁移到 JPA 命名查询。

【问题讨论】:

  • 在收到来自 JPA 调用的数据后,在 Java 中执行此操作(使用 replaceAll())可能更容易。

标签: java regex oracle jpa named-query


【解决方案1】:

我发现 JPA 中没有 REGEXP_SUBSTR 的等效项。所以我决定坚持原生查询执行。

【讨论】:

    【解决方案2】:

    如果您使用 eclipselink,请使用 SQL 将 SQL 集成到 JPQL 语句中。这提供了使用原生 SQL 查询的替代方法,因为查询可能需要 JPQL 不支持的函数。

    SQL 函数包括 SQL 字符串(内联到 JPQL 语句中)和转换为 SQL 字符串的参数。使用问号字符 (?) 在 SQL 中定义从 SQL 函数参数转换而来的参数。

    您可以使用 SQL 以非标准语法调用数据库函数,嵌入 SQL 文字,并在 JPQL 中执行任何其他 SQL 操作。使用 SQL,您仍然可以使用 JPQL 进行查询。

    例子

    select o from Entity o order by SQL('REGEXP_SUBSTR(?, ''[0-9]+'', 1, 1)', o.code)
    

    【讨论】:

      猜你喜欢
      • 2017-10-22
      • 2016-05-22
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 2018-09-28
      • 1970-01-01
      相关资源
      最近更新 更多