如何使用算术运算对不同类型的列进行算术运算过滤3 3

问题描述:

例如,我有这个简化的模型,其中时间戳和持续时间均表示秒。如何使用算术运算对不同类型的列进行算术运算过滤3 3

case class Item(id: Int, : Long, duration: Int)

val max_timestmap: Long = ??? val stmt = items.filter(x => (x.timestamp + x.duration) <= max_timestamp) db.run(stmt.result)

上面会不会与下面的错误,我有很难理解编译。

ambiguous implicit values: [error] both value BooleanOptionColumnCanBeQueryCondition in object CanBeQueryCondition of type => slick.lifted.CanBeQueryCondition[slick.lifted.Rep[Option[Boolean]]] [error] and value BooleanCanBeQueryCondition in object CanBeQueryCondition of type => slick.lifted.CanBeQueryCondition[Boolean] [error] match expected type slick.lifted.CanBeQueryCondition[Nothing] [error] filter(x => (x.timestamp + x.duration) <= max_timestamp)

更新1: 好像问题源于一个事实,即timestamp长,duration是诠释。当两者都是相同的数据类型时,它似乎可以编译。

更新2: 我发现此解决方案的工作。使用x.duration.asInstanceOf[Rep[Long]]或可能更合适x.duration.asColumnOf[Long]

+0

'(p => p.age nmat

+0

持续时间是一个int?这是什么意思,分钟数,秒数,小时数?只需将所有内容转换为相同类型 – nmat

+0

是的,持续时间以秒为单位,并且在表格中以这种方式表示。是否可以在不改变表中的当前数据类型的情况下进行转换? –

根据油滑文档COMING FROM SQL TO SLICK投期限龙:

在不同类型的算术运算需要使用.asColumnOf[T]显式转换。

正如你已经发现了,你必须明确地投durationLongx.duration.asColumnOf[Long]

尽管在告诉确切的问题帮助不大,错误消息有道理的,如果一个在Query.scala看着方法filter和特质/对象CanBeQueryCondition

sealed abstract class Query[+E, U, C[_]] extends QueryBase[C[U]] { self => 
    ... 
    def filter[T <: Rep[_]](f: E => T)(implicit wt: CanBeQueryCondition[T]): Query[E, U, C] = 
    withFilter(f) 
    ... 
} 

... 

trait CanBeQueryCondition[-T] extends (T => Rep[_]) 

object CanBeQueryCondition { 
    implicit val BooleanColumnCanBeQueryCondition : CanBeQueryCondition[Rep[Boolean]] = 
    new CanBeQueryCondition[Rep[Boolean]] { 
     def apply(value: Rep[Boolean]) = value 
    } 
    implicit val BooleanOptionColumnCanBeQueryCondition : CanBeQueryCondition[Rep[Option[Boolean]]] = 
    new CanBeQueryCondition[Rep[Option[Boolean]]] { 
     def apply(value: Rep[Option[Boolean]]) = value 
    } 
    implicit val BooleanCanBeQueryCondition : CanBeQueryCondition[Boolean] = 
    new CanBeQueryCondition[Boolean] { 
     def apply(value: Boolean) = new LiteralColumn(value) 
    } 
} 

正如@Federico Pellegatta指出,明确的对隐式参数CanBeQueryCondition[T]导致T = NothingT <: Rep[_]),因此报告错误。