Skip to content

feat: add cross-database json support#109

Merged
zhou-hao merged 6 commits into
hs-web:4.2from
zhou-ai-bot:codex/json-support
May 26, 2026
Merged

feat: add cross-database json support#109
zhou-hao merged 6 commits into
hs-web:4.2from
zhou-ai-bot:codex/json-support

Conversation

@zhou-ai-bot
Copy link
Copy Markdown
Contributor

变更内容

  • 新增通用 JSON 数据类型、编解码与 JSON 查询 term 支持。
  • 为 PostgreSQL/OpenGauss、MySQL/Kingbase、Oracle、SQL Server 挂载 JSON 类型与查询构建器。
  • 支持 json_exists、json_not_exists、json_contains、json_not_contains、json_contained、json_not_contained、json_value。
  • 补充 PostgreSQL JSON/JSONB codec 兼容,修复旧 data$exist 编码后缺少 jsonb cast 的问题。
  • 新增 SQL 生成单元测试和 PostgreSQL、MySQL 8、OpenGauss、SQL Server 真实集成测试类。

已本地验证

  • mvn -pl hsweb-easy-orm-rdb -am -DskipTests compile
  • mvn -pl hsweb-easy-orm-rdb -am -DskipTests test-compile
  • mvn -pl hsweb-easy-orm-rdb -Dtest=JsonTermFragmentBuilderTest test
  • mvn -pl hsweb-easy-orm-rdb -Dtest=PostgresqlJsonQueryIntegrationTest test
  • mvn -pl hsweb-easy-orm-rdb -Dtest=Mysql8JsonQueryIntegrationTest test
  • mvn -pl hsweb-easy-orm-rdb -Dtest=OpengaussJsonQueryIntegrationTest test

说明

  • SQL Server 本地真实测试在 Apple Silicon Docker 上启动 mcr.microsoft.com/mssql/server:2017-latest-ubuntu 时因 qemu 段错误未能进入 SQL 执行阶段,保留给 GitHub Actions 的 amd64 环境验证。

Object value = condition.getValue();
boolean number = isNumberExpression(termType, value);
JsonScalarExpression expression = createScalarExpression(columnFullName, column, condition, number);
PrepareSqlFragments fragments = PrepareSqlFragments.of();
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

使用BatchSqlFragments

if (data instanceof CharSequence) {
return data.toString();
}
if (PG_OBJECT_CLASS.equals(data.getClass().getName())) {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

不应该用反射.而是通过封装SPI来实现?

@zhou-hao
Copy link
Copy Markdown
Member

本轮已继续完善 PR:

  1. 修复兼容性风险

    • 优化 JsonCodecSupportServiceLoader 加载逻辑,避免可选驱动/provider 缺失时 ServiceConfigurationError 导致加载卡死或异常放大。
  2. 补充 JSON 回归测试

    • 新增 JsonCodecSupportTest,覆盖 SPI 注册与基础 JSON 字符串读取。
    • 增强 JsonTermFragmentBuilderTest,覆盖 PostgreSQL/MySQL JSON path、isnull/notnull、path normalize/segments。
  3. 补充 batch insert 兼容性测试

    • 新增 BatchInsertSqlBuilderCompatibilityTest,覆盖 runtime default 主键以及复合主键包含 NullValue 时不按部分主键误去重的行为。

已执行验证:

mvn -pl hsweb-easy-orm-rdb \
  -Dtest=JsonCodecSupportTest,JsonTermFragmentBuilderTest,BatchInsertSqlBuilderCompatibilityTest test

结果:10 tests, 0 failures, 0 errors。

mvn -pl hsweb-easy-orm-rdb \
  -Dtest=DefaultSaveOrUpdateOperatorTest,DefaultUpsertOperatorTest,UpsertOperatorParametersTest,PostgresqlBasicTest test

结果:22 tests, 0 failures, 0 errors。

能力边界说明:repository 层建议统一使用 JsonTermType + JsonValueCondition;不同数据库由 Dialect/SchemaMetadata 翻译。当前已统一支持 exists/contains/value,PostgreSQL/OpenGauss/MySQL 8 额外支持 contained;PostgreSQL jsonpath (@?/@@/jsonb_path_*) 仍属于后续扩展项。

@zhou-hao
Copy link
Copy Markdown
Member

已补一层语义化 JSON DSL:

  • jsonExists(column, path)
  • jsonContains(column, value)
  • jsonContained(column, value)
  • jsonValue(column, path, termType, value)
  • jsonValue(column, path, value)

同时补了 QueryTest 覆盖,确认这些方法会落到对应 term 上。

已推送到 PR 分支:95ac8d81 feat(core): 增加 json dsl 条件方法

@zhou-hao
Copy link
Copy Markdown
Member

继续完善:

  • 增加严格条件模式:Query.of().strictTerm(true) 会把 easyorm.strict.term=true 传到 RDB 查询构造层。
  • 严格模式下,遇到不支持的 termType、无法解析的列、join/foreign key 条件会直接抛出 UnsupportedOperationException,避免被静默忽略。
  • 非严格模式保持历史兼容:不支持的条件仍返回空 SQL 片段。
  • 修复一个别名查询缺陷:select name as nickname 后用 nickname 作为条件时,会正确回查到真实列 name,严格模式下不再误报。

验证:

  • JAVA_HOME=$(/usr/libexec/java_home -v 17) mvn -pl hsweb-easy-orm-core -Dtest=QueryTest test:2 passed, 0 failed, 0 skipped。
  • JAVA_HOME=$(/usr/libexec/java_home -v 17) mvn -pl hsweb-easy-orm-rdb -Dtest=QueryTermsFragmentBuilderTest,QueryTermsFragmentBuilderStrictModeTest test:8 passed, 0 failed, 0 skipped。

备注:本机默认 Maven 使用 JDK8,会因项目 target 17 失败;已切换 JDK17 执行。

@zhou-hao
Copy link
Copy Markdown
Member

补充提交:89d064b5 test(rdb): 补充 JSON 严格模式集成测试

本次增加 JSON 查询集成测试中的 strict mode 覆盖:

  • strict mode 下 JSON 列使用支持的 JSON term 可正常查询。
  • strict mode 下非 JSON 列使用 JSON term 会快速失败,避免条件被静默忽略。

已执行集成测试:

JAVA_HOME=$(/usr/libexec/java_home -v 17) mvn -pl hsweb-easy-orm-rdb -Dtest=PostgresqlJsonQueryIntegrationTest,Mysql8JsonQueryIntegrationTest,OpengaussJsonQueryIntegrationTest,SqlServerJsonQueryIntegrationTest test

结果:8 passed, 0 failed, 0 skipped。覆盖 PostgreSQL、MySQL 8、OpenGauss、SQLServer。

@zhou-hao zhou-hao merged commit 35904b7 into hs-web:4.2 May 26, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants