Postgresql Postgres JDBC编号参数

Postgresql Postgres JDBC编号参数,postgresql,jdbc,Postgresql,Jdbc,我在Postgres 9.3数据库中有一个表,其中有一个json列,如下所示: CREATE mytable ( mycolumn json ) SELECT mycolumn->>'somefield', count(*) FROM mytable GROUP BY mycolumn->>'somefield' SELECT mycolumn->>?, count(*) FROM mytable GROUP BY my

我在Postgres 9.3数据库中有一个表,其中有一个json列,如下所示:

CREATE mytable (
  mycolumn json
)
SELECT
  mycolumn->>'somefield',
  count(*)
FROM
  mytable
GROUP BY
  mycolumn->>'somefield'
SELECT
  mycolumn->>?,
  count(*)
FROM
  mytable
GROUP BY
  mycolumn->>?
PREPARE mystatement AS
  SELECT
    mycolumn->>$1,
    count(*)
  FROM
    mytable
  GROUP BY
    mycolumn->>$1
我希望从Java应用程序执行如下查询:

CREATE mytable (
  mycolumn json
)
SELECT
  mycolumn->>'somefield',
  count(*)
FROM
  mytable
GROUP BY
  mycolumn->>'somefield'
SELECT
  mycolumn->>?,
  count(*)
FROM
  mytable
GROUP BY
  mycolumn->>?
PREPARE mystatement AS
  SELECT
    mycolumn->>$1,
    count(*)
  FROM
    mytable
  GROUP BY
    mycolumn->>$1
当我尝试使用这样的预处理语句时:

CREATE mytable (
  mycolumn json
)
SELECT
  mycolumn->>'somefield',
  count(*)
FROM
  mytable
GROUP BY
  mycolumn->>'somefield'
SELECT
  mycolumn->>?,
  count(*)
FROM
  mytable
GROUP BY
  mycolumn->>?
PREPARE mystatement AS
  SELECT
    mycolumn->>$1,
    count(*)
  FROM
    mytable
  GROUP BY
    mycolumn->>$1
我得到以下错误:

PSQLException: ERROR: column "mytable.mycolumn" must appear in the GROUP BY clause or be used in an aggregate function
这是有道理的,因为Postgres不能保证两个位置参数相同

使用psql,我可以编写如下语句:

CREATE mytable (
  mycolumn json
)
SELECT
  mycolumn->>'somefield',
  count(*)
FROM
  mytable
GROUP BY
  mycolumn->>'somefield'
SELECT
  mycolumn->>?,
  count(*)
FROM
  mytable
GROUP BY
  mycolumn->>?
PREPARE mystatement AS
  SELECT
    mycolumn->>$1,
    count(*)
  FROM
    mytable
  GROUP BY
    mycolumn->>$1

使用JDBC可以做到这一点吗?

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

将我的陈述准备为
挑选
mycolumn->>1美元,
计数(*)
从…起
空白表
分组
mycolumn->>2美元
由于
$1
的值不一定与
$2
的值相同,PostgreSQL解析器将拒绝它,因为您可能没有在同一列上分组

解决方案可能是:

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