Search code examples
javadatabasescalaslickfuture

How to use Future in database access


I'm using slick in a mixed Java/Scala program.
The Java code needs to get some data from the database.
As I understand, the recommended way is to get a Future from the database, but how do I proceed from here? Am I forced to wait for the result (using blocking Await.result)? can I make the Java act similarly to Scala with onComplete?

current (blocking) code:

slick [Scala]:

def getUser(email: String): Option[User] = {  
    val findUser = users
        .filter(_.email === email)
        .result
        .headOption

    Await.result(db.run(findUser), Duration(1000, "millis")) // blocking :-(
}

Java:

if(UsersDataBase.getUser(email).isDefined()) {
...
}

Solution

  • You need to convert (or wrap) Scala Future to Java Future. The same with Option

    In this days you can use scala-java8-compat

    The simple example is:

    import scala.compat.java8.FutureConverters._
    import java.util.concurrent.CompletionStage
    import scala.concurrent.Future
    
    
    val javaFuture:CompletionStage[String] = Future.successful("ok").toJava