2016-06-08 2 views
0

Ich magAbfrage ausführen, wenn eine andere Abfrageergebnis einige Bedingungen in Slick3.0 Spiele

einen Tisch etwas
final class FooTable(tag: Tag) extends Table[Foo](tag, "foo") { 

    def id = column[Int]("id", O.PrimaryKey) 

    def amount = column[Long]("amount") 

    def createTs = column[Timestamp]("create_ts") 

    def updateTs = column[Timestamp]("update_ts") 

    def * = (id, amount, status, createTs, updateTs) <> (Foo.tupled, Foo.unapply) 

} 

und versuchen TableQuery[FooTable].map{_.amount}.sum >= 10L und wenn das Ergebnis wahr zu prüfen ist, möchte ich einige DBIO.seq in einem einzigen auszuführen db.run.

Bisher habe ich versucht,

val action = for { 
    bar <- (foos.map{_.amount}.sum <= givenLongValue) 
    result <- DBIO.seq("//some queries here") if bar 
    } yield result 

aber das funktioniert nicht, weil dieser Fehler

gefunden: slick.lifted.Rep [Boolean] erforderlich: Boolean

und ich habe auch so versucht

(fooes.map{_.amount}.sum <= amount).filter{_}.map{ x => 
     DBIO.seq("some actions") 
} 

aber dies erzeugt auch einen Fehler

nicht impliziten Wert für den Parameter ol gefunden: slick.lifted.OptionLift [slick.driver.MySQLDriver.api.DBIOAction [Unit, slick.driver.MySQLDriver.api .NoStream, slick.driver.MySQLDriver.api.Effect.Write mit slick.driver.MySQLDriver.api.Effect.Transactional], slick.lifted.Rep [Option [QO]]]

Wie kann Ich erreiche das?

Vielen Dank im Voraus.

Antwort

1

sollten Sie versuchen, die folgenden:

val query = TableQuery[FooTable] 
val givenLongValue = 10L 
val action = query.map(_.amount).sum.result.flatMap { 
    case Some(sum) if sum <= givenLongValue => DBIO.seq(...) 
    case _ => DBIO.successful(...) // You should decide here what you want to return in case of `None` or `sum > 10L` 
}.transactionally 
Verwandte Themen