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

1 篇文章 0 订阅
1 篇文章 0 订阅

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值