2016-03-29 7 views
0

Ich bin neu in Scala und Play Framework. Ich versuche, alle Daten für ausgewählte Spalten aus einer Datentabelle abzufragen und sie als Excel-Datei zu speichern.Anorm: implizite Konvertierung [alle Werte (einschließlich null)] in [String]

Ausgewählte Spalten haben in der Regel unterschiedliche Typen wie Int, Str, Zeitstempel usw.

Ich möchte alle Werttypen konvertieren, sind null in String (null umwandeln zu leeren String „“) ohne zu wissen, der tatsächliche Typ einer Spalte, so dass der Code für alle Tabellen verwendet werden kann.

Nach Play-Dokument kann ich den impliziten Konverter unten schreiben, jedoch kann dies nicht mit Null umgehen. Für lange Zeit gegoogelt, kann keine Lösung finden. Kann mir bitte jemand sagen, wie man im impliziten Konverter mit Null umgehen kann?

Vielen Dank im Voraus ~

implicit def valueToString: anorm.Column[String] = 
    anorm.Column.nonNull1[String] { (value, meta) => 
     val MetaDataItem(qualified, nullable, clazz) = meta 
     value match { 
      case s: String    => Right(s) // Provided-default case 
      case i: Int     => Right(i.toString()) // Int to String 
      case t: java.sql.Clob  => Right(t.toString()) // Blob/Text to String 
      case d: java.sql.Timestamp => Right(d.toString()) // Datatime to String 
      case _      => Left(TypeDoesNotMatch(s"Cannot convert $value: ${value.asInstanceOf[AnyRef].getClass} to String for column $qualified")) 
     } 

    } 
+0

Welchen Fehler sehen Sie zur Laufzeit? – tryx

+0

Fehlermeldung: java.lang.RuntimeException: Links (UnexpectedNullableFound (Spaltenname (.valuea, Some (valuea)))) bei anorm.MayErr $$ anonfun $ get $ 1.apply (MayErr.scala: 35) – WeiJ

Antwort

1

Wie in den documentation angegeben, wenn es ein Column[T], so dass dem Spalte des Typs kann T, und wenn die Spalte (n) null sein zu analysieren, seine Option[T] sollte dann gefragt, profitierte von der generischen Unterstützung als Option[T].

Dort ist es eine benutzerdefinierte Column[String] (stellen Sie sicher, dass die benutzerdefinierte verwendet wird, nicht die bereitgestellten Column[String]), so Option[String] sollte gefragt werden.

import myImplicitStrColumn 
val parser = get[Option[String]]("col") 
+0

Hallo cchantep, Ja, ich habe Folgendes versucht: 'implicit def valueToString: anorm.Column [Option [Zeichenfolge]] = anorm.Column.nonNull1 [Option [Zeichenfolge]] {(Wert, Meta) => val MetaDataItem (qualifiziert, Nullable, clazz) = meta Wert Übereinstimmung { Fall s: Option [Zeichenfolge] => .... Fall i: Option [Int] => ... Fall t: Option [java.sql.Clob] => .. Fall d: Option [java.sql.Timestamp] => ... Fall _ => .. } } 'aber Fehler bekommen" kann Int nicht in String konvertieren .... " – WeiJ

+0

Wie gesagt, sollten Sie keine' Column [Option [T]] ', sondern eine' Column [T] '+ mit der generischen' Option definieren 'support – cchantep

+0

Ich sehe ... Danke ~ Ich werde es versuchen ... Ich dachte, Anorm könnte einen einfacheren Weg anbieten, mit Null umzugehen, weil das so üblich ist. – WeiJ