Postgres JDBC编号参数

时间:2014-11-15 09:04:52

标签: postgresql jdbc

我在Postgres 9.3数据库中有一个表,其中包含一个json列:

CREATE mytable (
  mycolumn json
)

我想从Java应用程序执行如下所示的查询:

SELECT
  mycolumn->>'somefield',
  count(*)
FROM
  mytable
GROUP BY
  mycolumn->>'somefield'

当我尝试使用像这样的PreparedStatement:

SELECT
  mycolumn->>?,
  count(*)
FROM
  mytable
GROUP BY
  mycolumn->>?

我收到以下错误:

PSQLException: ERROR: column "mytable.mycolumn" must appear in the GROUP BY clause or be used in an aggregate function

这是有道理的,因为Postgres不能保证两个位置参数是相同的。

使用psql,我可以准备一个这样的语句:

PREPARE mystatement AS
  SELECT
    mycolumn->>$1,
    count(*)
  FROM
    mytable
  GROUP BY
    mycolumn->>$1

是否可以使用JDBC执行此操作?

1 个答案:

答案 0 :(得分:1)

不,这是不可能的。 JDBC只有位置参数,因此PostgreSQL驱动程序将其呈现为:

PREPARE mystatement AS
  SELECT
    mycolumn->>$1,
    count(*)
  FROM
    mytable
  GROUP BY
    mycolumn->>$2

由于$1的值不一定与$2相同,PostgreSQL的解析器会拒绝它,因为您可能没有在同一列上进行分组。

解决方案可能是:

SELECT a.aColumnLabel, count(*)
FROM (
    SELECT mycolumn->>? as aColumnLabel
    FROM mytable
) a
GROUP BY a.aColumnLabel