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

ProcedureCall.createStoredProcedureCall()非实体类使用优雅方案

存储过程结果映射非实体类的简化实现方案

现有方案痛点

  • 原生resultSetMappings方案在面对20个以上返回字段的场景时,需要编写超长的逐字段映射配置,开发效率和手动循环遍历ResultSet赋值没有本质区别,多查询场景下重复编码量极高。

期望实现效果

仅通过自定义注解标记非实体类,即可在存储过程调用时直接传入类类型,自动完成全字段结果映射,无需逐字段编写配置:

  1. 标记非实体映射类
@NonEntityMapper
public class Object1{
    // 20+ 业务属性
}
  1. 直接传入类类型调用存储过程
createStoredProcedureCall("SP_NAME", Object1.class)

具体实现方案

核心逻辑是封装通用自动映射逻辑,替代逐字段硬编码配置:

  • 首先自定义@NonEntityMapper类注解,标记该类为存储过程返回结果的映射目标DTO,默认开启类属性与返回列的自动名匹配:支持下划线列名转小驼峰属性名的自动映射(如返回列create_time自动匹配属性createTime)、完全同名列直接映射。
  • 封装通用的createStoredProcedureCall工具方法,入参为存储过程名称、映射目标类类型:
    • 方法内部调用底层ORM框架或者原生JDBC能力执行存储过程,获取原始ResultSet结果集
    • 首次加载某个DTO类时,通过反射扫描类的所有属性,提前构建「返回列名 -> 属性赋值方法」的映射关系缓存,后续重复调用直接读缓存
    • 遍历ResultSet逐行读取数据时,按映射关系自动给对应属性赋值,最终返回填充完成的DTO实例集合
  • 针对个别列名和属性名无法自动匹配的特殊场景,可额外增加一个字段级注解@MapperColumn("db_col_name")做单独配置即可,不需要给所有字段写映射。

这套逻辑是通用可复用的,后续新增任意多字段的存储过程查询,只需要定义对应属性的DTO类加@NonEntityMapper注解,不需要编写任何额外的映射配置,重复编码量可以降到最低。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:24:59