2014-12-24 24 views
1

我使用JPA,並具有以下本地PostgreSQL的查詢:原生查詢參數沒有在Java中通過Java EE工作EE

@NamedNativeQuery(name = "Player.getStandardDev", query ="SELECT STDDEV(?1) FROM Player WHERE ?2 IS NOT NULL") 

(我意識到可能是不需要IS NOT NULL檢查,但是這不是在這種情況下問題的來源)。

然後我有下面的代碼試圖執行查詢:

Query query = getEntityManager().createNamedQuery("Player.getStandardDev"); 
query.setParameter(1, attribute); 
query.setParameter(2, attribute); 
return (BigDecimal) query.getSingleResult(); 

getSingleResult()被調用時,我收到以下錯誤:

org.postgresql.util.PSQLException: ERROR: function stddev(character varying) does not exist 
    Hint: No function matches the given name and argument types. You might need to add explicit type casts. 
    Position: 8 

我想這是因爲到setParameter來電工作不正常,所以沒有更換? s

有沒有其他的方式來使用本機查詢whe你可以設置參數。

回答

1

發生此錯誤的原因是,當您將查詢參數設置爲生成的SQL中的字符串文本時,它不會被視爲列名稱。因此,它成爲

SELECT STDDEV('column_name') FROM Player ... 

,而不是

SELECT STDDEV(column_name) FROM Player ... 

引起,因爲該函數預計列名或數值的錯誤。

您不能在JPA查詢中動態設置列名。您必須以某種方式對其進行硬編碼或使用其他方式構建查詢。有關更多詳細信息,請參閱此SO post