当前位置: 首页 > 工具软件 > Scala Slick > 使用案例 >

scala slick 使用macro 实现根据字段名排序

扈德容
2023-12-01

假设我们有一张表user

case class User(
                 mobile: String,
                 name: Option[String],
                 id: Long
               )

class UserTable(tag: Tag) extends Table[User](tag, "user") {

  val mobile = column[String]("mobile")
  val name = column[Option[String]]("name")
  val id = column[Long]("id", O.PrimaryKey)

  def * = (mobile, name, id) <>(
    User.tupled, User.unapply
    )
}

object UserTable {
  val table = TableQuery[UserTable]

  def apply() = table
}

但我们想要根据前端传来的字段进行排序的时候我们不得不这么写

val sortFieldName = "id"
table.sortBy((e)=>
    sortFieldName match {
        case "id" => if (true)
          e.id.asc
        else
          e.id.desc
        case "name" => if (true)
          e.name.asc
        else
          e.name.desc
        case "mobile" => if (true)
          e.mobile.asc
        else
          e.mobile.desc
      }
)

这是十分无聊乏味的工作,
所有使用宏来替我们生成这些代码吧
这是宏的实现代码:https://github.com/1178615156/scala-macro-example/blob/master/macros/src/main/scala/macross/slick/SortWith.scala

现在就可以这样写了

table.sortBy((e: UserTable) => SortByName.apply(e, "name", true))

详细的使用例子:
https://github.com/1178615156/scala-macro-example/blob/master/macros_using/src/main/scala/macross/slick/SortByNameUsing.scala

 类似资料: