【问题标题】:Slick - Compiled with dynamic sortBySlick - 使用动态 sortBy 编译
【发布时间】:2015-01-18 00:32:18
【问题描述】:

我知道从 slick 2.1 开始。可以使用 ConstColumn 使用“已编译”来获取和删除预编译查询。

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 触发的。如果用户单击“名称”标题,则应根据“名称”对表格进行排序 - 与“状态”相同。

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

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

【问题讨论】:

  • 调用代码已经需要知道需要进行什么样的排序(它传入了 sortBy 参数),那么为什么不让它为每一列调用不同的函数呢?如果开销太大,如果将匹配上移一个级别,然后根据匹配的列调用完整的 sortBy 函数,这会影响预编译吗?
  • (老问题,但有赏金所以还有兴趣吗?)我天真地建议ConstColumn[String],但我猜这行不通。最好使用每个排序的编译查询并使用地图查找它们,这可以解决您的问题 - 假设这就是您使用的?猜测很难在不重复一些代码的情况下编写,但仍然应该相当紧凑。喜欢我提个建议吗?

标签: scala slick slick-2.0


【解决方案1】:

Slick 没有提供一种方法来记忆已编译查询的动态排序依据。我认为解决此问题的唯一方法是记住每个排序列的已编译查询并根据动态排序键查找查询。即,构建一个映射,其中键是排序列名称,值是已编译的查询,该列使用 sortBy。

当然,如果你编译的查询有一个连接并且你想对正在连接的表中的一个列进行排序,那么这对你不起作用。

如果性能不是问题并且您没有其他理由使用编译查询,请不要使用它们。

【讨论】:

    猜你喜欢
    • 2014-08-03
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多