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
相关产品推荐
相关产品推荐

