【问题标题】:Slick/Scala - how do I access fields of the mapped projection/projected table part of a join in a where querySlick/Scala - 如何在 where 查询中访问连接的映射投影/投影表部分的字段
【发布时间】:2014-06-01 03:10:27
【问题描述】:

我定义了许多基本查询,并且正在使用查询组合来添加诸如排序、分页、where 子句等内容...

但我在访问 where 子句中连接的第二个表的字段时遇到问题...

这是我的表查询和我的表。所有表都映射到案例类。

val basicCars = TableQuery[CarTable]
val basicCarValues = TableQuery[CarValueTable]

val carsWithValues = for {
    (c, v) <- basicCars leftJoin basicCarValues on (_.id === _.carId)
} yield (c, v.?)

现在我通过做一些事情来重用/组合查询,例如

carsWithValues.where(_._1.id === someId)

效果很好……

但如果我想访问第二张表的任何值......我会尝试

carsWithValues.where(_._2.latestPrice === somePrice)

它告诉我somePrice 不是MappedProjection 的成员......

错误:值 somePrice 不是 scala.slick.lifted.MappedProjection[Option[com......datastore.slick.generated.Tables.CarValue],(Option[Long], Option[Long] 的成员, 选项[字符串],.....

我知道这种方法行不通,因为 _._2 是 MappedProjection 而不仅仅是位于元组中的 CarValue..

但我不知道如何在 where 子句中使用 MappedProjection 中的表的任何字段?

【问题讨论】:

    标签: scala join where slick


    【解决方案1】:

    来自 Slick 代码生成器的 .? 是使用 MappedProjection 实现的,它不再具有成员。如果您将电话推迟到.?,它会起作用:

    val carsWithValues = for {
        (c, v) <- basicCars leftJoin basicCarValues on (_.id === _.carId)
    } yield (c, v)
    
    carsWithValues.where(_._2.latestPrice === somePrice).map{ case (c,v) => (c,v.?) }
    

    【讨论】:

    • 顺便说一句。哪里会被弃用。请改用过滤器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 2015-04-01
    • 1970-01-01
    • 2014-12-19
    相关资源
    最近更新 更多