2014-10-02 175 views
0

我有以下Oracle SQL查询:JPA:相当于Oracle的REGEXP_SUBSTR

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这样的数据示例中失败。

您可以让我知道如何将我的SQL查询迁移到使用REGEXP_SUBSTR的等效项的JPA命名查询。

+0

它可能更容易(()'使用'的replaceAll)要做到这一点在Java中,你已经从JPA呼叫收到数据后。 – 2014-10-02 11:24:30

回答

0

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

0

如果您使用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)