Skip to content

Queries

szeiger edited this page Apr 3, 2011 · 5 revisions

Queries

Queries are typically constructed with for-comprehensions. The simple SQL query SELECT id, last FROM users WHERE first = 'Stefan' becomes:

val q1 = for(u <- Users if u.first === "Stefan") yield u.id ~ u.last

Note the use of “===” instead of the usual “==” operator. “Not equal” uses the “=!=” operator instead of “!=”. Alternatively, you can use the methods is and isNot.

Implicit joins can be created with multiple generators:

      val q4c = for {
        u <- Users
        o <- Orders if o.userID is u.id
      } yield u.first ~ o.orderID

Note that these are just queries, they can be built outside of a Session and do not touch the database until they are invoked by an Invoker. You do not need to fiddle with Invokers by hand, there is an implicit conversion. Here are some of the most useful operations implicit invokers supply:

    db withSession {
        val list:List[(Int,String)] = q1.list    //list of (id,last) tuples
        val first:(Int,String) = q1.first    //(id,last) tuple of first result
        val res = q1.mapResult(f)    //map function, f must be of type (Int,String)=>T in this case
    }

There is also a foreach method defined, so you can use the result of the query in a for loop directly,
but in this case, you need a Session.

    db withSession {
        for((id,last) <- q1) println("id: "+id+", last: "+last)
    }

Of course, you could have printed the results without storing the query first in q1:

    db withSession {
        for(u <- Users if u.first === "Stefan") println("id: "+u._1+", last: "+u._3)
    }
Clone this wiki locally