Хорошо, поэтому, если вы действительно можете изменить класс корпуса Transaction
, то есть лучшее решение, чем HList
(что, если честно, может быть немного громоздким, чтобы работать с ним позже).
Так вот в чем дело: давайте представим, у вас есть User
таблицу со следующими атрибутами:
- Ид
- имя
- фамилия
- факультет
- finalGrade
- улица
- номер
- город
- Postcode
Выше колонны не может иметь смысл, но давайте использовать их в качестве примера. Самый простой способ справиться с выше, чтобы создать случай класс:
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
).
какая версия scala вы используете? –
Более 22 столбцов, которые вы могли бы использовать HList, вот суть: https://gist.github.com/davegurnell/8dd7d01eff8e59877abb –
Не знаете о пятнах, но вы можете обрабатывать более 22 полей в JSON с помощью https : //github.com/xdotai/play-json-extensions –