假设我们有一张表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))