2016-06-11 106 views
0

我這是從Java應用程序是這樣執行的查詢:PostgreSQL的功能全面和JPA /休眠

Query query = getEntityManager().createQuery(hql); 

查詢看起來是這樣的:

String hql = "select * from table a where round(column1, 3) = round(parameter, 3)"; 

這裏column1Double類型。它的價值就像143.02856666。我需要保留原來的價值,但對於某些業務邏輯只需進行整理和比較即可。

配置的初始數據庫是H2,這工作正常。現在數據庫已經更改爲Postgres,現在這個查詢出錯了。

ERROR: function round(double precision, integer) does not exist Hint: No function matches the given name and argument types. You might need to add explicit type casts.

Postgres中的round()函數接受一個數字數據類型並需要一個轉換。

如果直接在Postgres控制檯中執行,下面的查詢可以正常工作。

select * from table a where round(cast(column1 as numeric), 3) = round(cast(parameter as numeric), 3); 

同樣從java應用程序出錯。

java.lang.IllegalArgumentException: org.hibernate.QueryException: Could not resolve requested type for CAST : numeric

也試過Query query = getEntityManager().createNativeQuery(hql); 這將導致一個新的錯誤。

org.hibernate.engine.jdbc.spi.SqlExceptionHelper - ERROR: syntax error at or near "where"

如果我調試,執行下面這行時出錯。

List resultList = query.getResultList(); 

如何重寫查詢,以便它對付Postgres?

+0

參數是一個實際參數,並且表中沒有列嗎?如果是這樣,如果查詢字符串從未被操縱過,你的查詢將如何工作?另外我只用Eclipselink和Postgres測試了一個nativeQuery,它可以工作。我建議你總是把問題切成要點,併爲這樣的問題提供表格定義... –

+0

謝謝,我的壞會保重。該參數將被傳遞給執行此查詢的方法。它類似於:parmeter,並將使用.setParameter(「parameter」,parameterValue)傳入; – VKC

+1

我已通過將其轉換爲映射到數字的big_decimal來解決此問題。四捨五入(cast(column1作爲數字),3)舍入(cast(column1作爲big_decimal),3)。在控制檯中啓用show_sql顯示此查詢爲round(cast(column1作爲數字(19,2),3))任何指針,如果它可以以某種方式寫入,以便將數字(19,2)轉換爲數字(19,6) ),因爲這會給我更準確的結果。 – VKC

回答

0

你在做什麼與Query query = getEntityManager().createQuery(hql);調用jpql-查詢,它不支持所有db函數,如round(v numeric, s integer)

兩個建議:

  1. 使用BETWEEN和維護JPQL映射
  2. 寫NativeQuery - >Query query = em.createNativeQuery(queryString);

queryString只是要通過你的參數改變。

+0

感謝您的建議,我嘗試使用createNativeQuery,但沒有奏效。問題在於映射數據類型。請看我上面的評論。 – VKC