Postgresql Postgres JDBC编号参数
我在Postgres 9.3数据库中有一个表,其中有一个json列,如下所示: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
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