scala - 使用 Slick 3 的动态排序

标签 scala orm slick-3.0

我试图在我的查询中动态包含一个 sortBy,它根据查询参数中的字符串名称进行排序。在 Slick 3 中,这已被证明是相当棘手的。目前我的设置是:

trait Model {
    type ATable <: AbstractTable[_]

    def tableQuery: TableQuery[ATable]

    def sortMap: Map[String, Rep[_]]

    private def sortKey[T](e: ATable, sort: (String, SortOrder)): ColumnOrdered[_] = sort match {
       case (field, SortOrder.Asc) => ColumnOrdered(sortMap.getOrElse(field, throw new ClientException(s"Can't sort by $field")), Ordering(Ordering.Asc))
       case (field, SortOrder.Desc) => ColumnOrdered(sortMap.getOrElse(field, throw new ClientException(s"Can't sort by $field")), Ordering(Ordering.Desc))
    }
    def all(sort: (String, SortOrder)) = tableQuery.sortBy(sortKey(_, sort)).result
}

object User extends Model {
    type ATable = Tables.User
    val tableQuery = Tables.User

    val sortMap = Map( "id" -> tableQuery.id )
}

但是运行 db.run(User.all(("id", SortOrder.Asc)) 会抛出以下错误:

slick.SlickException: No type for symbol name found in Vector[t2<@t3<UnassignedType>>]

有谁知道更好的解决方案或我哪里出错了?

最佳答案

我解决这个问题的方法是更改​​我的 sortMap 以包含具有隐式列类型的表类型(从 Map[String, Rep[_]]Map[String, ATable => Rep[_]]):

trait Model {
    type ATable <: AbstractTable[_]

    def tableQuery: TableQuery[ATable]

    def sortMap: Map[String, ATable => Rep[_]]

    private def sortKey(baseQ: Query[ATable, ATable#TableElementType, Seq], sort: (String, SortOrder)) = {
       val rep = sortMap.getOrElse(sort._1, throw new ClientException(s"Can't sort by ${sort._1}"))
       val orderedRep = sort._2 match {
          case SortOrder.Asc => (t: ATable) => ColumnOrdered(rep(t), slick.ast.Ordering(slick.ast.Ordering.Asc))
          case SortOrder.Desc => (t: ATable) => ColumnOrdered(rep(t), slick.ast.Ordering(slick.ast.Ordering.Desc))
       }
       q.sortBy(orderedRep)
   }

   def all(sort: (String, SortOrder)) = sortKey(tableQuery, sort).result
}

object User extends Model {
    type ATable = Tables.User
    val tableQuery = Tables.User

    val sortMap = Map( "id" -> { (t: ATable) => t.id } )
}

此解决方案唯一欠佳的方面是,如果将新列添加到数据库,则必须手动将其添加到 sortKey。我正在考虑将这些映射包含在表代码生成脚本中。

关于scala - 使用 Slick 3 的动态排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37280358/

相关文章:

scala - 在 Slick 3 中以事务方式使用

postgresql - 使用 slick 的 3.0.0 流式结果和 Postgresql 的正确方法是什么?

scala - pyspark 与 scala 中的 FPgrowth 计算关联

database - 初始化对象或直接从数据库读取/写入数据库效率更高吗?

scala - "!"在 Scala 中是什么意思?

javascript - ExtJS 和复杂的保存操作

SQL、MVC、 Entity Framework

scala - Slick 3 插入不插入但没有错误

scala - Spark : Efficient mass lookup in pair RDD's

json - 2.1 Scala JsValue转Java ObjectNode