Java 使用Spring的NamedParameterJDBCTemplate的命名参数分组

Java 使用Spring的NamedParameterJDBCTemplate的命名参数分组,java,sql,spring,postgresql,spring-jdbc,Java,Sql,Spring,Postgresql,Spring Jdbc,我正在使用PostgreSQL和Spring 3.1 NamedParameterJdbcTemplate 如果我有一些SQL使用Select&GROUPBY子句中的命名参数,Postgres会将其作为错误语法返回。使用手动替换的参数运行查询将正常工作 假设有一个名为“table”的表,其中包含两列id和编号 此SQL: 按某个函数ID:param从表组中选择某个函数ID:param、avgnumber 由数据库记录为: 按某个函数ID$2从表组中选择某个函数ID$1、avgnumber 我怀疑

我正在使用PostgreSQL和Spring 3.1 NamedParameterJdbcTemplate

如果我有一些SQL使用Select&GROUPBY子句中的命名参数,Postgres会将其作为错误语法返回。使用手动替换的参数运行查询将正常工作

假设有一个名为“table”的表,其中包含两列id和编号

此SQL:

按某个函数ID:param从表组中选择某个函数ID:param、avgnumber

由数据库记录为:

按某个函数ID$2从表组中选择某个函数ID$1、avgnumber

我怀疑查询计划器查看此查询时不知道$1==2,因此它给出了错误列“id”必须出现在GROUP BY子句中或在聚合函数中使用

有没有办法用弹簧来解决这个问题?是否有某种方法可以获取它,从而使查询变成:

是否改为使用某个函数ID$1从表组中选择某个函数ID$1、avgnumber?我想查询计划器对此不会有问题。

您可以写:

SELECT some_function(id, $1), avg(number) FROM table GROUP BY 1;
它将按SELECT结果的某个函数ID$1的第一列进行分组

另一种方法是这样写:

SELECT grp, avg(number)
FROM (SELECT some_function(id, $1) as grp, number FROM table)
GROUP BY grp;

第一个解决方案不起作用。第二种方法适用于更简单的SQL查询。我最后做了手工更换。