2013-10-08 6 views
1

J'utilise Scala 2.10 et j'ai des problèmes avec Slick (requêtes simples, java.sql.ResultSet). Si j'écrire des requêtesConversion implicite de RESULTSET pour les requêtes

Q.query[String, ResultSet](query).list(rs.getString("id"))

éclipse me dira could not find implicit value for parameter rconv: scala.slick.jdbc.GetResult[java.sql.ResultSet]

Ma source la plus importante pour cette question (http://slick.typesafe.com/doc/0.11.2/sql.html) ne contribue pas. Comment écrire ces conversions implicites? Et y a-t-il une autre manière familière de représenter ResultSet s dans Slick?

Répondre

4

Essayons-moi de faire la lumière :). Lorsque vous avez ResultSet, vous devez avoir un type auquel vous mappez les ensembles de résultats. Par exemple. un tuple ou une classe de cas qui tiendra votre rang. Dans le cas d'une classe personnalisée (case), vous devrez fournir un implicitGetResult qui décrit comment mapper d'un jdbc ResultSet à votre classe. L'argument à .list devrait être une valeur que vous voulez Slick mettre dans l'espace réservé de votre instruction préparée, pas quelque chose que vous obtenez notre ResultSet (en supposant que c'est ce que rs signifie).

L'utilisation suggérée est quelque chose comme ceci:

import scala.slick.jdbc.{GetResult, StaticQuery} 
import StaticQuery.interpolation 

val price = 1000.0 

// use tuples 
val expensiveDevices: List[Device] = 
    Q.query[String, (Long,Double,Date)]("select * from DEVICE where PRICE > ?").list(price) 

// or a case class (needs implicit GetResult for Device) 
case class Device(id: Long,price: Double,acquisition: Date) 
implicit val getDeviceResult = 
    GetResult(r => Device(r.<<, r.<<, r.<<)) 
val expensiveDevices2: List[Device] = 
    Q.query[String, Device]("select * from DEVICE where PRICE > ?").list(price) 

// or the even nicer interpolation syntax 
val expensiveDevices3: List[Device] = 
    sql"select * from DEVICE where PRICE > $price" .as[Device].list