Skip to content

fix(upsert): 修复 SQLServer 和 Oracle 空主键批量保存#108

Merged
zhou-hao merged 4 commits into
4.2from
fix/sqlserver-oracle-upsert-null-id
May 23, 2026
Merged

fix(upsert): 修复 SQLServer 和 Oracle 空主键批量保存#108
zhou-hao merged 4 commits into
4.2from
fix/sqlserver-oracle-upsert-null-id

Conversation

@zhou-hao
Copy link
Copy Markdown
Member

目的

修复 SQLServer 和 Oracle 批量 upsert 在主键列缺失、主键值为空或 doNothingOnConflict 场景下的异常/非法 SQL 问题。

核心变更

  • SQLServer / Oracle 批量 upsert 按行拆分数据:
    • 有有效主键值的行继续走 MERGE upsert;
    • 未传主键列、主键缺失、主键值为 null 或 NullValue 的行回退为批量 insert,并移除主键列,避免显式插入 null 主键。
  • 修复 doNothingOnConflict 且无可更新列时生成空 when matched then update set 的非法 SQL。
  • SQLServer 主键列匹配改用 equalsNameOrAlias,兼容 ID / id 等大小写和 alias 差异。
  • 新增 SQLServer、Oracle 批量 upsert 回归测试。

测试

已执行:

JAVA_HOME=$(/usr/libexec/java_home -v 17) mvn -pl hsweb-easy-orm-rdb -Dtest=SqlServerBatchUpsertOperatorTest,OracleBatchUpsertOperatorTest test

结果:

Tests run: 7, Failures: 0, Errors: 0, Skipped: 0
BUILD SUCCESS

覆盖用例:

  • 未传主键列时回退批量 insert;
  • SQLServer 主键大小写 / alias 匹配;
  • doNothingOnConflict 不生成空 update 分支;
  • 部分行有主键、部分行主键为空时拆分为 insert + merge。

集成测试

不适用:本次为 SQL 构造器和 SaveOrUpdateOperator 分支逻辑修复,已通过单元测试验证生成 SQL 类型和分支行为;未引入新的外部服务装配或协议联调链路。

覆盖率

本次命令触发 Jacoco report 生成;由于本地 target 中存在历史执行数据,Jacoco 输出了 class execution data mismatch 警告。已以新增回归单元测试和 surefire 通过结果作为本次变更验证依据。

文档同步

不涉及用户文档或 API 文档变更。

风险说明

  • SQLServer / Oracle 的 upsert 仍基于主键 MERGE;业务唯一键作为冲突键的增强不在本 PR 范围。
  • 混合数据会拆为 insert 与 merge 两条执行请求,SaveResult 中新增/更新数量仍受底层数据库 update 返回值影响。

@codecov-commenter
Copy link
Copy Markdown

codecov-commenter commented May 22, 2026

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

❌ Patch coverage is 82.08333% with 43 lines in your changes missing coverage. Please review.
✅ Project coverage is 66.21%. Comparing base (68b2764) to head (dca2934).
⚠️ Report is 41 commits behind head on 4.2.

Files with missing lines Patch % Lines
...b/supports/mssql/SqlServerBatchUpsertOperator.java 82.47% 10 Missing and 7 partials ⚠️
...rdb/supports/oracle/OracleBatchUpsertOperator.java 82.29% 10 Missing and 7 partials ⚠️
...uilder/fragments/insert/BatchInsertSqlBuilder.java 42.85% 0 Missing and 4 partials ⚠️
...erator/dml/upsert/DefaultSaveOrUpdateOperator.java 66.66% 0 Missing and 1 partial ⚠️
.../operator/dml/upsert/UpsertOperatorParameters.java 96.42% 0 Missing and 1 partial ⚠️
...m/rdb/supports/mysql/MysqlBatchUpsertOperator.java 66.66% 1 Missing ⚠️
...pports/opengauss/OpengaussBatchUpsertOperator.java 66.66% 1 Missing ⚠️
...pports/postgres/PostgresqlBatchUpsertOperator.java 66.66% 1 Missing ⚠️
Additional details and impacted files
@@             Coverage Diff              @@
##                4.2     #108      +/-   ##
============================================
+ Coverage     64.92%   66.21%   +1.28%     
- Complexity     2341     2476     +135     
============================================
  Files           343      358      +15     
  Lines          9375    10206     +831     
  Branches        940     1168     +228     
============================================
+ Hits           6087     6758     +671     
- Misses         2810     2867      +57     
- Partials        478      581     +103     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@zhou-ai-bot
Copy link
Copy Markdown
Contributor

Reopen to trigger pull_request workflow for the latest test changes.

@zhou-hao zhou-hao merged commit c38ec5a into 4.2 May 23, 2026
1 check passed
@zhou-hao zhou-hao deleted the fix/sqlserver-oracle-upsert-null-id branch May 23, 2026 10:42
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.

3 participants