我這是從Java應用程序是這樣執行的查詢:PostgreSQL的功能全面和JPA /休眠
Query query = getEntityManager().createQuery(hql);
查詢看起來是這樣的:
String hql = "select * from table a where round(column1, 3) = round(parameter, 3)";
這裏column1
是Double
類型。它的價值就像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?
參數是一個實際參數,並且表中沒有列嗎?如果是這樣,如果查詢字符串從未被操縱過,你的查詢將如何工作?另外我只用Eclipselink和Postgres測試了一個nativeQuery,它可以工作。我建議你總是把問題切成要點,併爲這樣的問題提供表格定義... –
謝謝,我的壞會保重。該參數將被傳遞給執行此查詢的方法。它類似於:parmeter,並將使用.setParameter(「parameter」,parameterValue)傳入; – VKC
我已通過將其轉換爲映射到數字的big_decimal來解決此問題。四捨五入(cast(column1作爲數字),3)舍入(cast(column1作爲big_decimal),3)。在控制檯中啓用show_sql顯示此查詢爲round(cast(column1作爲數字(19,2),3))任何指針,如果它可以以某種方式寫入,以便將數字(19,2)轉換爲數字(19,6) ),因爲這會給我更準確的結果。 – VKC