我通过Java EE使用JPA并具有以下本机postgresql查询:
@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
的调用无法正常工作,因此不会替换?
是否有其他方法可以使用本机查询来设置参数。
答案 0 :(得分:1)
发生错误是因为当您为查询设置参数时,它将在生成的SQL中作为字符串文字计算,而不是作为列名称。所以它变成
SELECT STDDEV('column_name') FROM Player ...
而不是
SELECT STDDEV(column_name) FROM Player ...
导致错误,因为函数需要列名或数值。
您无法在JPA查询中动态设置列名。您必须以某种方式对其进行硬编码或使用其他方式构造查询。有关详细信息,请参阅此SO post。