【问题标题】:Native Query parameters not working in Java EE本机查询参数在 Java EE 中不起作用
【发布时间】:2015-02-22 18:33:50
【问题描述】:

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

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

【问题讨论】:

    标签: java sql postgresql jakarta-ee jpa


    【解决方案1】:

    发生错误是因为当您为查询设置参数时,它在生成的 SQL 中被评估为字符串文字,而不是列名。于是就变成了

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

    而不是

    SELECT STDDEV(column_name) FROM Player ...
    

    由于函数需要列名或数值而导致错误。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-11
      • 2015-02-16
      • 2020-12-10
      • 1970-01-01
      • 2017-05-13
      • 1970-01-01
      • 2020-12-24
      • 1970-01-01
      相关资源
      最近更新 更多