ケース - 実際に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
を使う必要もない)。
どのスカラー版をお使いですか? –
22列以上のHListを使用すると、ここに要点があります: https://gist.github.com/davegurnell/8dd7d01eff8e59877abb –
滑らかさについてはわかりませんが、httpsの助けを借りてJSONの22個以上のフィールドを処理できます://github.com/xdotai/play-json-extensions –