【问题标题】:Sorting Slick query results in a for expression对 Slick 查询进行排序会产生一个 for 表达式
【发布时间】:2012-12-31 06:40:26
【问题描述】:

以下函数可以正常工作,但我希望它先按 parent_id 对结果进行排序,然后按顺序。

def getTree = for {
  (a, c) <- Activities leftJoin Clients on (_.id === _.id_a)
} yield (a.id, a.label, a.parent_id, a.order, c.id.?, a=c.name)

我如何使用 Slick 做到这一点?

【问题讨论】:

    标签: scala scalaquery slick


    【解决方案1】:

    和普通的收藏一样吗?

    getTree.sortBy(r => r._3 ~ r._4)
    

    【讨论】:

    • 元组语法有多直观......不是。太糟糕了,旧的 orderBy(nameThatHasMeaning, otherMeaningfulName.desc) 已被弃用,取而代之的是 sortBy(x=> x._3 ~ x._4) 语法。 Slick 作者这样做是有原因的,但最终用户会遭受样板和毫无意义的计算结果是哪个元组数。
    • 您可以yield 一些案例类实例和getTree.sortBy(r =&gt; r.parent_id ~ r.order),但案例类的实际声明是一个样板。也许命名为Tuple-s,使用('name1 -&gt; value1, 'name2 -&gt; value2) 之类的构造函数和apply(name: Symbol) 之类的访问器将在核心Scala 中有用吗?例如:yield (a.id, a.label, 'parent_id -&gt; a.parent_id, 'order -&gt; a.order, c.id.?, a=c.name),然后是getTree.sortBy(r =&gt; r('parent_id) ~ r('order))
    • 这个答案对 Slick 2.1 仍然有效吗? IDEA 没有找到 ~ 运算符。还是我错过了一些神奇的导入语句?
    【解决方案2】:

    使用 Slick 2.1,我发现它可以工作:

    myQuery.sortBy(r => (r._3, r._4))
    

    (通过在我的查询中调用 selectStatement 进行验证)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多