2011-08-12 12 views
1

J'ai une classe cas MyRecord que je veux utiliser pour chaque ligne dans un ResultSet:Comment utiliser des colonnes NULL avec Anorm et Play Framework?

case class MyRecord(id: Int, remindeMe: Option[org.joda.time.DateTime]) 

Comment sélectionner toutes les lignes d'une table et retourne une liste de MyRecord utilisant Scala et Anorm avec le cadre de lecture?

J'ai essayé avec:

def getRecords() : List[MyRecord] = { 
     val records = SQL("SELECT id, data FROM mytable")().collect { 
      case Row(id: Int, Some(data: Long)) => 
         MyRecord(id, new org.joda.time.DateTime(data)) 
    } 
} 

Si la colonne data est nulle, je veux None sinon je veux Some(data) comme RemindMe dans la classe de cas. Oui, le code Scala ci-dessus est très mauvais, mais je ne comprends pas comment résoudre ce problème.

Répondre

0

Cela devrait fonctionner comme vous avez déjà défini l'option:

def getRecords() : List[MyRecord] = { 
     SQL("SELECT id, data FROM mytable")().collect { 
      case Row(id: Int, Some(data: Long)) => 
        MyRecord(id, Some(new org.joda.time.DateTime(data))) 
      case Row(id: Int, None) => 
        MyRecord(id, None) 

    } 
} 

Le cas que vous collez ignorerait tous les Aucun résultats car ils ne correspondraient pas à certains (données)

EDIT: ajout de la "toList" à la fin le résout, comme l'a dit @kassens. Je l'ai testé dans un jeu 1.2.2-Scala 0.91 env. Il y a un moyen de lui donner des points? :)

+0

Merci, mais comment l'obtenir à une liste? Maintenant, j'ai cette erreur: 'Erreur soulevée est: incompatibilité de type; trouvé: scala.collection.immutable.Stream [models.MyRecord] requis: List [models.MyRecord] ' – Jonas

+0

@Jonas collect devrait retourner la liste, j'ai mis à jour le code, le val ne devrait pas être là. Avez-un test rapide dans un environnement Scala (No jouer Anorm si) et cela a fonctionné –

+0

Oui, j'ai également supprimé les enregistrements val avant d'exécuter le code. C'est le code actuel qui retourne 'scala.collection.immutable.Stream [models.MyRecord]' au lieu de 'List [models.MyRecord]' – Jonas

Questions connexes