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

Spring Boot测试中H2数据库Criteria API GROUP BY报错求助

问题分析与解决方法

核心原因

H2数据库在开启**严格SQL模式(如ONLY_FULL_GROUP_BY)**时,对GROUP BY的位置引用(比如你生成的SQL里的group by 1)兼容性差——它无法识别1代表第一列tenant_app_id,因此错误判定该列未被包含在分组条件中。

解决办法

方法1:调整H2的SQL模式

修改测试环境的H2连接URL,禁用严格分组检查,或者切换为兼容MySQL/PostgreSQL的模式,避免位置引用的解析问题。

在application-test.yml中配置:

spring:
  datasource:
    url: jdbc:h2:mem:testdb;MODE=MySQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE

或者直接移除ONLY_FULL_GROUP_BY模式:

spring:
  datasource:
    url: jdbc:h2:mem:testdb;SQL_MODE=TRADITIONAL,NO_ENGINE_SUBSTITUTION;DB_CLOSE_DELAY=-1

方法2:显式指定分组字段

修改Criteria查询代码,直接用具体的字段路径而非变量tenant来分组,确保Hibernate生成显式列名的GROUP BY语句,而非位置索引。

比如:

query
    .multiselect(
        root.get("tenantAppId"), // 显式指定字段
        cb.count(root)
    )
    .where(cb.and(
        statusIsEqual,
        lifeSpanNotNull,
        lifespanGtZero,
        notExpired
    ))
    .groupBy(root.get("tenantAppId")); // 对应显式字段分组

这样生成的SQL会变成group by p1_0.tenant_app_id,H2就能正确识别分组字段了。


内容的提问来源于stack exchange,提问作者Thomas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 15:52:11