EclipseLink 2.7.7 JPA Criteria API如何调用LISTAGG WITHIN GROUP
在EclipseLink 2.7.7中用Criteria API调用Oracle LISTAGG的正确方式
Oracle的LISTAGG函数必须搭配WITHIN GROUP (ORDER BY ...)子句使用,而H2允许省略该子句,这就是你在Oracle中报错的原因。EclipseLink 2.7.7支持通过Criteria API为LISTAGG添加该子句,具体做法是利用FunctionExpression的withinGroup方法:
代码示例
// 构造LISTAGG基础函数,指定聚合列和分隔符 FunctionExpression<String> listaggFunc = builder.function( "LISTAGG", String.class, joinedTable.get("name"), builder.literal(",") // 分隔符可根据需求修改 ); // 添加WITHIN GROUP (ORDER BY ...)子句 Expression<String> listaggExpr = listaggFunc.withinGroup( builder.orderBy(joinedTable.get("name")) ); // 将表达式加入查询并设置别名 criteriaQuery.multiselect(listaggExpr.alias("source"));
说明
builder.function用于创建LISTAGG函数的基础部分,传入函数名、返回类型、聚合列和分隔符(Oracle的LISTAGG默认无分隔符,建议显式指定避免歧义)。withinGroup方法是EclipseLink为支持这类特殊聚合函数提供的API,传入排序表达式后,会自动生成WITHIN GROUP (ORDER BY ...)子句。- 这段代码在Oracle中会生成符合语法要求的SQL:
LISTAGG(joined_table.name, ',') WITHIN GROUP (ORDER BY joined_table.name) AS source,同时在H2中也能兼容(H2会忽略WITHIN GROUP子句,按默认规则聚合)。
内容的提问来源于stack exchange,提问作者user19603207
相关产品推荐
相关产品推荐

