2014-10-02 106 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)