2016-01-22 31 views
0

我有一個例外,當我部署在Tomcat以下查詢:QuerySyntaxException與HQL

@Query("select max(cast(substring(r.reference,9,4) as decimal(4,0))) from RequestDbo r where substring(r.reference,0,9) = :referenceRoot") 
Long getMaxReference(@Param("referenceRoot") String referenceRoot); 


的exeption是:

org.hibernate.hql.internal.ast.QuerySyntaxException:期望CLOSE,發現'('在第1行第54列[選擇 max(鑄造(子字符串(r.reference,9,4)爲十進制(4,0)))RequestDbo r where substring(r.reference, 0,9)=:referenceRoot]

當在sql server上直接執行查詢時,查詢就OK了。

我看到我的hql沒有語法錯誤...

任何想法?

+0

看起來像ORM用'[]'引用了整個查詢:'[select max(cast(substring(r.reference,9,4)as decimal(4,0)))from RequestDbo r where substring r.reference,0,9)=:referenceRoot]' – lad2025

+0

該類包含其他查詢,這些查詢以相同方式簽名並且運行良好。例如:@Query(「從RequestDbo r中選擇r」) – Maxime

回答

0

Hibernate在JPQL查詢中不支持這種鑄造as decimal(4,0)。作爲解決方法,您有四種選擇:

  1. 將您的數據加載到Java,然後獲得最高值;
  2. 使用Java類來轉換所需的值,然後在JPQL查詢中調用它的構造函數;
  3. 使用原生SQL;
  4. 創建一個SQL函數來轉換所需的值並在查詢的MAX中調用該函數。

我也推薦你看看這個問題this question。祝你好運!

+1

非常感謝您的回答Bonifacio。這個問題是由你提到的原因造成的。我finaly修復它在刪除CAST和解析在java端而不是在JPQL。 – Maxime