You need to enable JavaScript to run this app. SQL Server使用INNER JOIN时如何让Go结构体仅返回关联表名称字段
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server使用INNER JOIN时如何让Go结构体仅返回关联表名称字段

方案1(最推荐):新增接口响应DTO结构体

业务中通常会把数据库映射模型和接口返回模型分开,避免内部结构暴露,也方便灵活调整返回字段:

  1. 定义专门用于返回的DTO结构体:
type UserResponse struct {
    IdUser    int64  `json:"id_user"`
    Name      string `json:"name"`
    Surname   string `json:"surname"`
    Email     string `json:"email"`
    RoleName  string `json:"role_name"`
    StateName string `json:"state_name"`
}
  1. 修改查询逻辑,直接将结果扫描到DTO字段:
// 把原来的[]model.User改成[]UserResponse
users := []UserResponse{}
for rows.Next() {
    var u UserResponse
    if err := rows.Scan(&u.IdUser, &u.Name, &u.Surname, &u.Email, &u.RoleName, &u.StateName); err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }
    users = append(users, u)
}

这种方式没有冗余字段,返回的JSON就是你需要的平级结构,也不会出现多余的0001-01-01零值时间。


方案2:修改原有User结构体

如果你不想新增结构体,可以调整原有model.User的字段标签:

  1. 给嵌套的关联结构体字段加json:"-"忽略序列化,新增两个平级的name字段:
type User struct {
    Id_User       int64     `json:"id_user,omitempty"`
    Name          string    `json:"name,omitempty"`
    Surname       string    `json:"surname,omitempty"`
    Email         string    `json:"email,omitempty"`
    // 忽略嵌套结构体的序列化
    Id_RoleUser   UserRole  `json:"-"`
    Id_UserState  UserState `json:"-"`
    // 新增平级返回字段
    RoleName      string    `json:"role_name,omitempty"`
    StateName     string    `json:"state_name,omitempty"`
    // 不需要返回的字段也可以加json:"-"忽略,避免返回零值时间
    NameSecond    string    `json:"-"`
    SurnameSecond string    `json:"-"`
    Password      string    `json:"-"`
    CreatedAt     time.Time `json:"-"`
    UpdatedAt     time.Time `json:"-"` // 注意你原tag写错了,把updated_at写成了crated_at
}
  1. 修改扫描逻辑,直接赋值给新增的平级字段:
rows.Scan(&user.Id_User, &user.Name, &user.Surname, &user.Email, &user.RoleName, &user.StateName)

方案3:自定义嵌套结构体的序列化规则

如果要保留原有结构体结构,也可以给UserRole和UserState实现MarshalJSON方法,序列化时直接返回name值:

func (ur UserRole) MarshalJSON() ([]byte, error) {
    return json.Marshal(ur.Name)
}

func (us UserState) MarshalJSON() ([]byte, error) {
    return json.Marshal(us.Name)
}

同时调整User结构体中这两个字段的json标签:

type User struct {
    // ... 其他字段不变
    Id_RoleUser   UserRole  `json:"role_name,omitempty"`
    Id_UserState  UserState `json:"state_name,omitempty"`
    // ... 其他字段不变
}

注意:该方案会影响所有使用这两个结构体的序列化场景,如果其他接口需要返回完整的UserRole/UserState结构则不适用。


另外你当前返回结果里的0001-01-01T00:00:00Z是因为time.Time是值类型,零值不是nil,omitempty标签不会自动忽略,不需要返回的字段直接加json:"-"忽略即可。

内容的提问来源于stack exchange,提问作者cosmos multi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 22:39:04