Slick - 使用动态 sortBy 编译

Posted

技术标签:

【中文标题】Slick - 使用动态 sortBy 编译【英文标题】:Slick - Compiled with dynamic 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],但我猜这行不通。最好使用每个排序的编译查询并使用地图查找它们,这可以解决您的问题 - 假设这就是您使用的?猜测很难在不重复一些代码的情况下编写,但仍然应该相当紧凑。喜欢我提个建议吗? 【参考方案1】:

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

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

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

【讨论】:

以上是关于Slick - 使用动态 sortBy 编译的主要内容,如果未能解决你的问题,请参考以下文章

在没有 setState 的情况下动态设置 react slick autoplayspeed

Slick.js使用方法(响应式轮播插件)

Slick Lifted Table 类型错误

Scala Play Framework Slick 会话不起作用

scala slick mysql 字段过多 tuple问题

我需要在 laravel 中使用 sortBy 进行分页