java - H2 用户定义的聚合函数 ListAgg,不能在第一个参数上使用 DISTINCT 或 TRIM()

标签 java sql h2

所以我有一个 DB2 生产数据库,我需要在其中使用可用的函数 ListAgg。我希望使用 H2 的单元测试能够正确测试此功能。不幸的是,H2 不直接支持 ListAgg。但是,我可以创建一个用户定义的聚合函数...

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.h2.api.AggregateFunction;

import com.google.common.base.Joiner;

public class ListAgg implements AggregateFunction
{

private List<String> values = new ArrayList<String>();
private String delimiter = ",";

@Override
public void init(Connection conn) throws SQLException
{
}

@Override
public int getType(int[] inputTypes) throws SQLException
{
    if (inputTypes.length != 2) {
        throw new java.sql.SQLException("The aggregate function ListAgg must have 2 arguments.");
    }
    return java.sql.Types.VARCHAR;
}

@Override
public void add(Object sqlValues) throws SQLException
{
    Object[] objects = (Object[]) sqlValues;
    this.delimiter = (String) objects[1];
    String value = (String) objects[0];
    values.add(value);
}

@Override
public Object getResult() throws SQLException
{
    return Joiner.on(delimiter).join(values);
}

}

我已经做到了。这对

ListAgg(columnName, ',')

但是失败了

ListAgg(DISTINCT TRIM(columnName), ',')

我错过了什么?

编辑: 我收到以下错误消息:

org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback;
bad SQL grammar [select ..., LISTAGG(DISTINCT TRIM(columnName), ',') as 
columnName_LIST, from ... group by ...]; nested exception is 
org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "SELECT ... "; 
expected "NOT, EXISTS, INTERSECTS, SELECT, FROM"; SQL statement:
select ... from ... group by ... [42001-174]    
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:231) 
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)

编辑2:

COUNT() 是否也实现了 AggregateFunction 还是它在内部使用了其他东西?因为 H2 能够处理 COUNT(DISTINCT columnName)

最佳答案

我认为 H2 不允许您在自定义聚合函数上使用 DISTINCT 关键字。但是您可以轻松定义您自己的“不同”版本的 ListAgg:

public class DistinctListAgg implements AggregateFunction {
    private Set<String> values = new LinkedHashSet<String>();
    // The rest is the same
}

关于java - H2 用户定义的聚合函数 ListAgg,不能在第一个参数上使用 DISTINCT 或 TRIM(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33047121/

相关文章:

java - Android 中的 View 占据整个屏幕 - 如何告诉 Canvas 尊重 View 的限制?

java - server.xml 中的 IPv6 连接器在 SipSessionImpl.setOutboundInterface 上抛出异常

mysql - 我如何在 sql 中进行查询,使 o 拥有更多房屋的人?

java - 在spring boot中在辅助数据库上创建表

通过 Jersey 发送请求时出现 javax.ws.rs.ProcessingException

sql - 如何在PostgreSQL中使用 'replace'函数进行字符串替换

sql - 光标说它是只读的,即使我声明它是 "for update"

java - 在 maven 中测试时 Spring-Data h2 : java. io.FileNotFoundException

grails - 如何将 2 个不同的项目连接到同一个开发环境数据库?

java - 在 Java 中处理巨大的文本文件