2014-01-23 29 views
1

java.persistence.Query中的函數CreateQuery(string)返回與我所請求的不同的查詢。JPA2 CreateQuery SQL服務器方言

我的輸入字符串的函數是:

from Underlying where (SUBSTRING(ticker, (charindex('.', ticker) + 1), (len(ticker) - charindex('.', ticker))) in (:exchanges) order by ticker

當我呼籲查詢getResultList(),我看到我日誌中的SQL語句:

Hibernate: select underlying0_.id as id63_, underlying0_.updated_date as updated2_63_, underlying0_.updated_user as updated3_63_, underlying0_.version as version63_, underlying0_.adr as adr63_, underlying0_.desk as desk63_, underlying0_.enabled as enabled63_, underlying0_.forward_start_enabled as forward8_63_, underlying0_.ticker as ticker63_, underlying0_.vol_shift_type as vol10_63_ from underlyings underlying0_ where (substring(underlying0_.ticker, charindex('.', underlying0_.ticker)+1) in (?)) order by underlying0_.ticker

這查詢不一個有效的SQL Server 2008的查詢和預期,我收到了一個錯誤:

SQL Error: 174, SQLState: S0001 The substring function requires 3 argument(s).

任何一個知道是怎麼回事Ø在這裏?

僅供參考,我曾嘗試以下兩種方言1)org.hibernate.dialect.SQLServer2008Dialect,和2)org.hibernate.dialect.SQLServer2008Dialect

+0

您可以嘗試LENGTH(ticker)而不是len(ticker)。 – Gayathri

+0

感謝您對Gayathri的回覆,我試着用LENGTH替換LEN,但是,我得到了相同的結果,即在我的輸入中3個參數被轉換爲2個參數,如日誌條目中所示。 –

+0

我想你錯過了一個右括號。 – Gayathri

回答

0

問題是與功能CHARINDEX。它在方言中不可用,因此會導致映射不正確。將其更改爲HQL函數「locate」(保持參數不變)解決了問題。我的查詢現在可以在SQL Server 2008中工作:

...where (substring(underlying0_.ticker, charindex('.', underlying0_.ticker)+1, len(underlying0_.ticker)-charindex('.', underlying0_.ticker)) in (?))...

-1

錯誤明確提到SUBSTRING()函數需要3個參數你逝去的2 。因此錯誤在您的查詢中。

瞭解SUBSTRING()功能

+0

感謝您的回覆。我明白這個問題是1失蹤。這不是我的問題。我正在詢問將字符串轉換爲數據庫特定查詢的方言(在本例中爲SQL Server 2008)。我的輸入字符串顯然有3個參數,然後轉換爲2個參數。不管怎麼說,多謝拉。 –