Slick 3.0.0 - 如何使用joinLeft对查询进行排序

时间:2015-09-15 16:50:56

标签: scala playframework slick slick-3.0 play-slick

此问题与another有关。我也尝试使用joinLeft对查询进行排序,但是在光滑的3.0.0中。由于Option Rep会自动解除,我将如何做同样的事情?:

def list(filter: String, orderBy: Int):Future[Seq[(Computer, Option[Company])]] = {
    val initialQuery = for {
        (computer, company) <- Computer.filter(_.name like filter) leftJoin 
            Company on (_.companyId === _.id)
    } yield (computer, company)

    val sortedQuery = orderBy match {
        case 2 => initialQuery.sortBy(_._1.name) //Works ok, column from a primary table
        case 3 => initialQuery.sortBy(_._2.map(_.name)) //could not find implicit value for parameter ol: slick.lifted.OptionLift[slick.lifted.ColumnOrdered[String],slick.lifted.Rep[Option[QO]]]
    }
    db.run(sortedQuery.result)
}

谢谢,

4 个答案:

答案 0 :(得分:5)

我认为缺少括号只是一个错字。我最近在使用你的例子在错误的地方指定排序方向时遇到了这个问题:

case 3 => initialQuery.sortBy(_._2.map(_.name.asc))

应该是:

case 3 => initialQuery.sortBy(_._2.map(_.name).asc)

答案 1 :(得分:0)

您确定要复制正确的代码吗?

case 3 => data.sortBy(_._2.map(_.name) //could not find implicit value for parameter

缺少“)”

应该是

case 3 => data.sortBy(_._2.map(_.name))

答案 2 :(得分:0)

您可以将字段放入结果集中。 例如:

 val initialQuery = for {
        (computer, company) <- Computer.filter(_.name like filter) leftJoin Company on (_.companyId === _.id)
        } yield (computer, company, company.map(_.name))

    val sortedQuery =  orderBy match {
        case 2 => initialQuery.sortBy(_._1.name) 
        case 3 => initialQuery.sortBy(_._3)
    }

    db.run(sortedQuery.map(v => (v._1, v._2).result)

答案 3 :(得分:0)

我也有这个问题。我有一个joinLeft,我想订购一个布尔列。您必须确定何时其连接为空时要替换哪个值。

例如:

initialQuery.sortBy(_._2.map(_.name).getOrElse(""))