Native Query参数在Java EE中不起作用

时间:2014-12-24 17:22:18

标签: java sql postgresql java-ee jpa

我通过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的调用无法正常工作,因此不会替换?

是否有其他方法可以使用本机查询来设置参数。

1 个答案:

答案 0 :(得分:1)

发生错误是因为当您为查询设置参数时,它将在生成的SQL中作为字符串文字计算,而不是作为列名称。所以它变成

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

而不是

SELECT STDDEV(column_name) FROM Player ...

导致错误,因为函数需要列名或数值。

您无法在JPA查询中动态设置列名。您必须以某种方式对其进行硬编码或使用其他方式构造查询。有关详细信息,请参阅此SO post