
h2数据库不支持postgresql的json_build_object函数,测试时需改用h2原生的json_object函数,或统一使用postgresql进行测试以保证sql行为一致性。
h2数据库不支持postgresql的json_build_object函数,测试时需改用h2原生的json_object函数,或统一使用postgresql进行测试以保证sql行为一致性。
在基于H2内存数据库进行单元测试时,即使启用了MODE=PostgreSQL(如连接字符串 jdbc:h2:mem:test;MODE=PostgreSQL;DB_CLOSE_DELAY=-1),H2也不会完全兼容PostgreSQL的所有专有函数。JSON_BUILD_OBJECT 正是这样一个典型的PostgreSQL内置函数——它在H2中并不存在,因此执行时会抛出 JdbcSQLSyntaxErrorException: Function "JSON_BUILD_OBJECT" not found。
✅ 正确做法是:使用H2官方支持的等效函数 JSON_OBJECT。该函数自 H2 2.0+ 版本起提供,语法更简洁,且语义与 json_build_object 高度一致:
-- PostgreSQL 原始写法(H2 不支持)
SELECT json_build_object('product', c."info"->'product') AS info FROM item."Item" AS c ...
-- ✅ H2 兼容写法(推荐用于测试)
SELECT JSON_OBJECT('product': c."info"->'product') AS info
FROM item."Item" AS c
INNER JOIN (
SELECT "rootId", MAX("revisionNo") AS maxRevisionNo
FROM item."Item"
WHERE "cRootId" = ?
GROUP BY "rootId"
) AS subquery
ON c."rootId" = subquery."rootId"
AND c."revisionNo" = subquery.maxRevisionNo
WHERE c."state" = 'active';
⚠️ 注意事项:
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
-
JSON_OBJECT(key: value, ...)是 H2 的标准语法(冒号分隔键值对),不支持逗号分隔的无引号键名(如JSON_OBJECT('product', c."info"->'product')是错误的); - 键名必须为字符串字面量(单引号包裹),值可为列、表达式或嵌套JSON函数(如
->操作符在H2中同样支持,前提是启用PostgreSQL模式); - 若项目对SQL兼容性要求极高(例如含大量PostgreSQL特有语法/函数),建议采用 Testcontainers + 真实PostgreSQL容器 进行集成测试,避免“测试通过但生产失败”的风险。
? 总结:H2的MODE=PostgreSQL仅模拟基础语法和部分行为,并非全功能兼容层。对于JSON操作,优先选用H2原生函数(如 JSON_OBJECT, JSON_ARRAY, JSON_VALUE);长期来看,应推动测试环境与生产环境数据库类型一致,以保障验证有效性。










