#V2EX

2d0154e14033e848...

npub195q4fc2qx05y3dzg49cny2lm7nsy52wrwuqjac844dnqnx6k7xks3pwpxu

hex

b8dbda582178477d499c8ffbc61dd4af2ff2c1d318c687dc481065ddc77a0cb0

nevent

nevent1qqst3k76tqshs3mafxwgl77xrh227tljc8f33358m3ypqewacaaqevqprpmhxue69uhhyetvv9ujuem4d36kwatvw5hx6mm9qgsz6q25u9qr86zgk3y2jufj90alfcz298phwqfwur66kesfndt0rtgzamxys

Kind-1 (TextNote)

2026-03-18T06:54:47Z

#V2EX

[问与答] [求助] Mybatis 自定义 Mapper 查询需要返回的字段 entityDO 并没有怎么办?

方案 1:在 DO 中冗余字段 + @Transient

在 DO 中增加额外字段,用于承载转换后的数据(如 URL 、格式化字段等),并通过 @Transient 标注为非持久化字段。

缺点:

  • 是否会污染 DO ?
  • DO 本应只表达数据库结构,这样做会不会破坏领域边界?

方案 2:Mapper 直接返回 VO

mapper 层通过 select 直接返回 VO (或 CO )。

缺点:

  • 拿到结果后不方便使用 MapStruct 做 assembler 转换:
    • 例如:OSS 的 key → URL 转换
    • GEO 坐标转换
    • bitmap 字段解析与转换

方案 3:引入中间 DTO ( DO → DTO → VO )

在 DO 和 VO 之间增加一层 DTO ,作为数据转换的中间载体。

缺点:

  • 类层级增加,显得冗余
  • 维护成本高
  • DTO 的归属不清晰(是否应该放在 infra 层?)

其他不太靠谱的方案

  • 使用 ResultMap + Map 进行处理
    • 可读性差
    • 可维护性差
    • 类型不安全 https://www.v2ex.com/t/1199196#reply2

原始 JSON

{
  "kind": 1,
  "id": "b8dbda582178477d499c8ffbc61dd4af2ff2c1d318c687dc481065ddc77a0cb0",
  "pubkey": "2d0154e14033e848b448a971322bfbf4e04a29c377012ee0f5ab66099b56f1ad",
  "created_at": 1773816887,
  "tags": [
    [
      "t",
      "v2ex"
    ]
  ],
  "content": "#V2EX\n### [问与答] [求助] Mybatis 自定义 Mapper 查询需要返回的字段 entityDO 并没有怎么办?\n\n### 方案 1:在 DO 中冗余字段 + `@Transient`\n\n在 DO 中增加额外字段,用于承载转换后的数据(如 URL 、格式化字段等),并通过 `@Transient` 标注为非持久化字段。\n\n**缺点:**\n\n* 是否会污染 DO ?\n* DO 本应只表达数据库结构,这样做会不会破坏领域边界?\n\n### 方案 2:Mapper 直接返回 VO\n\n在 `mapper` 层通过 `select` 直接返回 VO (或 CO )。\n\n**缺点:**\n\n* 拿到结果后不方便使用 MapStruct 做 assembler 转换:\n  + 例如:OSS 的 key → URL 转换\n  + GEO 坐标转换\n  + bitmap 字段解析与转换\n\n### 方案 3:引入中间 DTO ( DO → DTO → VO )\n\n在 DO 和 VO 之间增加一层 DTO ,作为数据转换的中间载体。\n\n**缺点:**\n\n* 类层级增加,显得冗余\n* 维护成本高\n* DTO 的归属不清晰(是否应该放在 infra 层?)\n\n### 其他不太靠谱的方案\n\n* 使用 `ResultMap + Map` 进行处理\n  + 可读性差\n  + 可维护性差\n  + 类型不安全\nhttps://www.v2ex.com/t/1199196#reply2",
  "sig": "8dda878e97f8f42df0d3debfafedf0a114ed510f6a486e93a3c44109da4a7b023bc7807736fa6b9f1ec92126bcc4013018a7e5df501bf40adb80c6bc4b5c63ec"
}