本机查询参数在Java EE中不起作用
我通过Java EE使用JPA,并具有以下本机postgresql查询:本机查询参数在Java EE中不起作用,java,sql,postgresql,jakarta-ee,jpa,Java,Sql,Postgresql,Jakarta Ee,Jpa,我通过Java EE使用JPA,并具有以下本机postgresql查询: @NamedNativeQuery(name = "Player.getStandardDev", query ="SELECT STDDEV(?1) FROM Player WHERE ?2 IS NOT NULL") (我意识到,的检查不是空的可能不需要,但这不是本例中问题的根源) 然后,我有以下代码尝试执行查询: Query query = getEntityManager().createNamedQuery("
@NamedNativeQuery(name = "Player.getStandardDev", query ="SELECT STDDEV(?1) FROM Player WHERE ?2 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
是否有其他方法可以使用本机查询来设置参数。发生此错误的原因是,当您为查询设置参数时,它在生成的SQL中作为字符串文字而不是列名进行计算。所以它变成了
SELECT STDDEV('column_name') FROM Player ...
而不是
SELECT STDDEV(column_name) FROM Player ...
这会导致错误,因为函数需要列名或数值
不能在JPA查询中动态设置列名。您必须以某种方式对其进行硬编码,或者使用其他方式构造查询。有关更多详细信息,请参见此