2017-02-22 11 views
2

Slickでプロシージャを呼び出すときに22制限をどのように克服できますか?22プロシージャの列の制限

は、現在持っている:

val q3 = sql"""call getStatements(${accountNumber})""".as[Transaction] 

問題は、我々はJSONFormatを行う際に、我々は、エラーを取得するため、我々は以上の22列と22の以上の列を持つことはできませんトランザクションケースクラスを返すことがあるということです

[error] E:\IdeaProjects\admin\Transaction.scala:59: No unapply or unapplySeq function found 
[error] implicit val jsonFormat = Json.format[Transaction] 

提案がありますか?

+0

どのスカラー版をお使いですか? –

+0

22列以上のHListを使用すると、ここに要点があります: https://gist.github.com/davegurnell/8dd7d01eff8e59877abb –

+0

滑らかさについてはわかりませんが、httpsの助けを借りてJSONの22個以上のフィールドを処理できます://github.com/xdotai/play-json-extensions –

答えて

2

ケース - 実際にTransactionケースクラスを変更できる場合は、HListよりも優れた解決策があります(これは、後で操作するのが少し面倒かもしれません)。だからここ

は、ものです:あなたは、次の属性を持つUserテーブルを持っている想像してみましょう:

  • ID
  • 教員
  • finalGrade
  • ストリート
  • 番号
  • 郵便番号

以上の列が意味をなすが、のは、一例として、それらを使用させないかもしれません。上記に対処する最も簡単な方法は、ケースクラスを作成することです:

case class User(
    id: Long, 
    name: String, 
    ... // rest of the attributes here 
    postCode: String) 

これはアプリケーション側の表からマップされます。

今、何をも行うことができますが、これを行うことです。

case class Address(street: String, number: String, city: String, postCode: String) 

case class UniversityInfo(faculty: String, finalGrade: Double) 

case class User(id: Long, name: String, surname: String, uniInfo: UniversityInfo, address: Address) 

この組成物は、(基本的に、あなたのケースクラス/タプルであまりにも多くの属性の問題です)あまりにも多くの列との問題を回避するのに役立ちます。 それ以外にも、単純に読みやすくするためだけでなく、多くの列を持っている場合は、これを行うことが常に(非常に頻繁に)有益であると主張します。マッピング

class User(tag: Tag) extends Table(tag, "User") { 

    // cricoss info 
    def id = column[Long]("id") 
    def name = column[String]("name") 

    // ... all the other fields 
    def postCode = column[String]("postCode") 

    def * = (id, name, surname, uniInfoProjection, addressProjection) <>((User.apply _).tupled, User.unapply) 

    def uniInfoProjection = (faculty, finalGrade) <>((UniversityInfo.apply _).tupled, UniversityInfo.unapply) 

    def addressProjection = (street, number, city, city) <>((Address.apply _).tupled, Address.unapply) 
} 

同じことを行う方法を

カスタムSQLマッピングを行うことができます。

implicit val getUserResult = GetResult(r => 
    User(r.nextLong, r.nextString, r.nextString, 
     UniversityInfo(r.nextString, r.nextDouble), 
     Adress(r.nextString, r.nextString, r.nextString, r.nextString)) 
)   

だから、単に物事を置くために - 複数のネストされたケースクラスにあなたのフィールドを分離すると、あなたの問題が(読みやすくする追加の利点と)離れて行く必要がありますしてみてください。あなたがそうするなら、タプル/ケースクラスの限界に近づくことは事実上決して問題にならないはずです(そして、HListを使う必要もない)。

+0

優れているのは、他のモデルで使用しているものとまったく同じです。しかし、結果が手続きの場合でも私はそれを行うことができますか?プロシージャの結果をTableクラスを拡張するクラスに取得できますか? – user836845

+0

確かに、「スリック」が関係している限り、それは単なるクエリ結果です。 –

+0

プロシージャの結果をTableクラスを拡張するクラスに取得できますか?はい、それは素晴らしいです。 – user836845