2017-02-22 8 views
2

Как мы можем преодолеть предел 22 при вызове процедур с помощью Slick?22 Ограничение столбца для процедур

В настоящее время мы имеем:

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

Проблема заключается в том, что мы должны вернуть более 22 столбцов и случай транзакций класса не может иметь более 22 столбцов, так как, когда мы делаем JSONFormat мы получаем ошибку:

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

Любые предложения?

+0

какая версия scala вы используете? –

+0

Более 22 столбцов, которые вы могли бы использовать HList, вот суть: https://gist.github.com/davegurnell/8dd7d01eff8e59877abb –

+0

Не знаете о пятнах, но вы можете обрабатывать более 22 полей в JSON с помощью https : //github.com/xdotai/play-json-extensions –

ответ

2

Хорошо, поэтому, если вы действительно можете изменить класс корпуса 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).

+0

Отлично, это то, что мы используем для других моделей. Но могу ли я сделать это, когда результат также будет выполнен из процедуры? Могу ли я получить результат процедуры в класс, который расширяет класс Table? – user836845

+0

Конечно, до тех пор, как «Slick» - это просто результат запроса. –

+0

Могу ли я получить результат процедуры в класс, который расширяет класс Table? Если да, это здорово. – user836845

Смежные вопросы