Skip to content

4.查询

afumu edited this page Jun 6, 2023 · 2 revisions

根据ID查询

  user, resultDb := gplus.SelectById[User](1)
  fmt.Println(resultDb.Error)
  fmt.Println(user)
  // SELECT * FROM `users` WHERE id = 1  ORDER BY `users`.`id` LIMIT 1
  user, resultDb := gplus.SelectById[User](999)
  fmt.Println(resultDb.Error)
  fmt.Println(user)
  // record not found
  // &{0    0  0  0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC}

如果查询不到记录,resultDb.Error 将返回 record not found

可以使用下面这种方式检查ErrRecordNotFound错误

// 检查 ErrRecordNotFound 错误
errors.Is(result.Error, gorm.ErrRecordNotFound)

根据多个ID查询

  users, resultDb := gplus.SelectByIds[User]([]int{1, 2, 3})
  fmt.Println(resultDb.Error)
  for _, user := range users {
    fmt.Println(user)
  }

查询单条记录

  query, u := gplus.NewQuery[User]()
  query.Eq(&u.Username, "张三")
  user, resultDb := gplus.SelectOne(query)
  fmt.Println(resultDb.Error)
  fmt.Println(user)

这里首次使用到query 条件对象,在Gorm-Plus中所有的查询条件都可以使用query对象来构建。

  query, u := gplus.NewQuery[User]()
  query.Eq(&u.Username, "张四")
  user, resultDb := gplus.SelectOne(query)
  fmt.Println(resultDb.Error)
  fmt.Println(user)
  // record not found
  // &{0    0  0  0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC}

如果查询不到记录,resultDb.Error 将返回 record not found

查询所有记录

  users, resultDb := gplus.SelectList[User](nil)
  fmt.Println(resultDb.Error)
  for _, user := range users {
    fmt.Println(user)
  }

根据条件查询记录

  query, u := gplus.NewQuery[User]()
  query.Ge(&u.Age, 18)
  users, resultDb := gplus.SelectList(query)
  fmt.Println(resultDb.Error)
  for _, user := range users {
    fmt.Println(user)
  }

注意:NewQuery 函数加了泛型之后,后续的查询方法就可以省略泛型了,Go编译器能自动推断出需要的泛型类型。

根据条件查询记录数量

  query, u := gplus.NewQuery[User]()
  query.Ge(&u.Age, 18)
  count, resultDb := gplus.SelectCount(query)
  fmt.Println(resultDb.Error)
  fmt.Println(count)

分页查询

  query, u := gplus.NewQuery[User]()
  page := gplus.NewPage[User](1, 2)
  query.Ge(&u.Age, 18)
  page, resultDb := gplus.SelectPage(page, query)
  fmt.Println(resultDb.Error)
  fmt.Println(page.Total)
  for _, user := range page.Records {
    fmt.Println(user)
  }

判断记录是否存在

  query, u := gplus.NewQuery[User]()
  query.Ge(&u.Age, 18)
  exists, resultDb := gplus.Exists(query)
  fmt.Println(resultDb.Error)
  fmt.Println(exists)

根据泛型返回数据

返回单条记录

  1. 返回自定义结构体
  query, u := gplus.NewQuery[User]()
  query.Eq(&u.Username, "张三")
  type UserVo struct {
    Username string
    Password string
  }
  userVo, resultDb := gplus.SelectGeneric[User, UserVo](query)
  fmt.Println(resultDb.Error)
  fmt.Println(userVo)

注意:这里 SelectGeneric 传入的第二个泛型返回的是非指针类型,如果需要返回指针类型需要使用 *User,例如:

  query, u := gplus.NewQuery[User]()
  query.Eq(&u.Username, "张三")
  type UserVo struct {
    Username string
    Password string
  }
  userVo, resultDb := gplus.SelectGeneric[User, *UserVo](query)
  fmt.Println(resultDb.Error)
  fmt.Println(userVo)

如果想要起别名,可以使用 gplus.As 函数

  query, u := gplus.NewQuery[User]()
  type UserVo struct {
    Name     string
    Password string
  }
  uvo := gplus.GetModel[UserVo]()
  query.Eq(&u.Username, "张三").Select(gplus.As(&u.Username, &uvo.Name), &u.Password)
  userVo, resultDb := gplus.SelectGeneric[User, UserVo](query)
  fmt.Println(resultDb.Error)
  fmt.Println(userVo)
  1. 返回map
  query, u := gplus.NewQuery[User]()
  query.Eq(&u.Username, "张三").Select(&u.Username, &u.Password)
  userMap, resultDb := gplus.SelectGeneric[User, map[string]any](query)
  fmt.Println(resultDb.Error)
  fmt.Println(userMap)
  1. 返回基础类型
  query, u := gplus.NewQuery[User]()
  query.Select(gplus.Sum(&u.Age))
  total, resultDb := gplus.SelectGeneric[User, int](query)
  fmt.Println(resultDb.Error)
  fmt.Println(total)

返回多条记录

  1. 返回自定义结构体列表
  query, u := gplus.NewQuery[User]()
  query.Ge(&u.Age, 18)
  type UserVo struct {
    Username string
    Password string
  }
  userVos, resultDb := gplus.SelectGeneric[User, []UserVo](query)
  fmt.Println(resultDb.Error)
  for _, userVo := range userVos {
    fmt.Println(userVo)
  }
  1. 返回map列表
  query, u := gplus.NewQuery[User]()
  query.Select(&u.Dept, gplus.Sum(&u.Score).As("score")).Group(&u.Dept)
  deptMaps, resultDb := gplus.SelectGeneric[User, []map[string]any](query)
  fmt.Println(resultDb.Error)
  for _, deptMap := range deptMaps {
    fmt.Println(deptMap)
  }
  1. 返回基础类型列表
  query, u := gplus.NewQuery[User]()
  query.Select(&u.Age).Distinct(&u.Age)
  allAges, resultDb := gplus.SelectGeneric[User, []int](query)
  fmt.Println(resultDb.Error)
  for _, age := range allAges {
    fmt.Println(age)
  }

根据泛型返回分页数据

  1. 返回自定义结构体分页列表
  type UserVo struct {
    ID       int64
    Username string
    Password string
  }
  query, u := gplus.NewQuery[User]()
  page := gplus.NewPage[UserVo](1, 10)
  query.Ge(&u.Age, 18)
  page, resultDb := gplus.SelectPageGeneric[User, UserVo](page, query)
  fmt.Println(resultDb.Error)
  fmt.Println(page.Total)
  for _, userVo := range page.Records {
    fmt.Println(userVo)
  }
  1. 返回map分页列表
  query, u := gplus.NewQuery[User]()
  page := gplus.NewPage[map[string]any](1, 10)
  query.Ge(&u.Age, 18)
  page, resultDb := gplus.SelectPageGeneric[User, map[string]any](page, query)
  fmt.Println(resultDb.Error)
  fmt.Println(page.Total)
  for _, userMap := range page.RecordsMap {
    fmt.Println(userMap)
  }

注意:返回是map类型数据的话,将会把数据存储到 RecordsMap 中,而不是 Records。

  1. 返回基础类型分页列表
  query, u := gplus.NewQuery[User]()
  query.Select(&u.Age).Distinct(&u.Age)
  page := gplus.NewPage[int64](1, 5)
  page, resultDb := gplus.SelectPageGeneric[User, int64](page, query)
  fmt.Println(resultDb.Error)
  fmt.Println(page.Total)
  for _, age := range page.Records {
    fmt.Println(*age)
  }

注意:返回是基础类型的话,Records 存储的是指针类型,需要通过 * 取值。