You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EclipseLink 2.7.7 JPA Criteria API如何调用LISTAGG WITHIN GROUP

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 05:27:37