光滑 - 使用动态sortBy编译

时间:2014-11-20 08:10:11

标签: scala slick slick-2.0

我知道光滑的2.1。可以使用ConstColumn在预编译的查询中使用" Compiled"来删除。

private val findXXXCompiled = Compiled { (someId:Column[Long], sortBy:???, drop:ConstColumn[Long], take:ConstColumn[Long]) =>

val q = findXXX(someId) // returns a Query

// I want to use query composition on "q" in order to further restrict my result:
q.sortBy {
  case (_, name, state) => sortBy match {
    case ??? => name.asc
    case ??? => name.desc
    case ??? => state.asc
    case ??? => state.desc
  }
}.drop(drop).take(take) // possible since slick 2.1. as described above using type ConstColumn

}

上面的示例代码由用户从具有表格布局的UI触发。如果用户点击"名称"然后表格应根据" name"进行排序。 - 对于"州"相同。

我无法工作的方面是将预编译与动态排序相结合(取决于表格布局中单击的标题)。当不预编译查询时,课程的动态排序有效。但作为方法" findXXX"非常复杂我出于性能原因肯定需要预编译。有关如何使用动态排序实现预编译的任何提示?

另请参阅:https://groups.google.com/forum/#!topic/scalaquery/my4EYt51qEM

1 个答案:

答案 0 :(得分:0)

Slick没有提供一种方式来记住动态sortBy的已编译查询。我认为解决此问题的唯一方法是记住每个排序列的已编译查询,并基于动态排序键查找查询。也就是说,构建一个映射,其中键是排序列名称,值是已编译查询,其中该列是sortBy。

当然,如果您的已编译查询具有联接并且您要对要联接的表中的列进行排序,那么这将对您不起作用。

如果不关心性能,并且您没有其他理由使用编译查询,那就不要使用它们。