2017-03-31 6 views
0

たとえば、タイムスタンプと継続時間の両方が秒を表すこの単純化モデルがあります。上記Slick 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)

アップデート1timestampが長く、durationがintであるという事実のために茎の問題のように思えます。両方が同じデータ型の場合、コンパイルされているようです。

更新2: この解決策が機能することが判明しました。スリックドキュメントCOMING FROM SQL TO SLICKによるとx.duration.asColumnOf[Long]

+0

'(p => p.age <= 23)'は機能しますか?あなたは輸入がないのですか? – nmat

+0

継続時間はintですか?それは何を意味しますか?分、秒、時の数ですか?すべてを同じタイプに変換してください – nmat

+0

はい、時間は秒単位であり、表のように表されます。テーブルの現在のデータ型を変更せずに変換を行うことは可能ですか? –

答えて

1

x.duration.asInstanceOf[Rep[Long]]またはおそらくより適切なを使用してロングに期間をキャスト:異なる種類で

算術演算が.asColumnOf[T]を使用して明示的なキャストが必要です。

すでに発見したとして、あなたは明示的Longdurationをキャストする必要がありますx.duration.asColumnOf[Long]。正確な問題を語る上で非常に有用ではないが1は、方法filterを見て、特性/ Query.scalaCanBeQueryConditionオブジェクト場合、エラーメッセージが理にかなって

1

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[_])になり、したがって報告されたエラーです。

関連する問題