2015-09-02 3 views
1

У меня есть случай класса с большим количеством полейпятно 3 отображение пользовательских полей

case class H(  
          id: Int, 
          min: Option[String] = None, 
          max: Option[String] = None, 
          step: Option[String] = None, 
          ... 
          ) 

Как можно отобразить несколько поля к столу?

class TH(tag: Tag) extends Table[H](tag, "H") { 
    def id = column[Long]("ID", O.PrimaryKey, O.AutoInc) 
    def min = column[Option[String]]("M") 

    def * = (id, min) <>(H.tupled, H.unapply) 
} 

, когда я попытался как этот - def * = (id, min) <>(H.tupled, H.unapply), вместо карты всех полей, есть исключение компиляции. Можно ли сопоставить настраиваемое поле с таблицей?

BR!

ответ

1

tupled и unapply - это всего лишь базовая функция, генерируемая классом case, которая определяет следующие функции (между прочим) со всеми полями класса case.

Например, для случая класса X(a: A, b: B, c: C, d: D), у вас есть:

def tupled(a: a, b: b, c: c, d: d): X 
def unapply(x: X): Option[(A, B, C, D)] 

В другой стороны, ваша проекция строится с <> ожидает параметры: (f: (U => R), g: (R => Option[U])), где U является combinaison вашего типа полей.

Вы не привязаны использовать «автоматический» tupled/исключить его, если они не соответствуют вашим потребностям, вы можете дает собственное определение:

class TH(tag: Tag) extends Table[H](tag, "H") { 
    def id = column[Long]("ID", O.PrimaryKey, O.AutoInc) 
    def min = column[Option[String]]("M") 

    def * = (id, min) <> (
    { tuple: (Long, Option[String]) => TH(id, min) }, 
    { th: TH => Some((th.id, th.min)) } 
) 
} 
+0

спасибо Попробовал, смотрите ответ ниже – initmax

+0

ошибки усталым, компиляции – initmax

0

Спасибо, попробовал. Получена ошибка компиляции. Невозможно использовать ошибку компиляции => TH. Изменено на H.

Error:Play 2 Compiler: def * = (id, idUser) <>({ 
Error:Play 2 Compiler:       ^
Error:Play 2 Compiler: 
    }, { hq: TH => Some((hq.id, hq.idUser)) }) 
         ^
No matching Shape found. 
Error:Play 2 Compiler: Slick does not know how to map the given types. 
Error:Play 2 Compiler: 
Possible causes: T in Table[T] does not match your * projection. Or you use an unsupported type in a Query (e.g. scala List). 
    Required level: slick.lifted.FlatShapeLevel 
     Source type: (slick.lifted.Rep[Long], slick.lifted.Rep[Long]) 
Error:Play 2 Compiler: 
    Unpacked type: (slick.lifted.Rep[Long], slick.lifted.Rep[Long]) 
     Packed type: Any 
    def * = (id, idUser) <>({ 
Error:Play 2 Compiler:      ^
Error:Play 2 Compiler: 
(compile:compileIncremental) Compilation failed 
Total time: 9 s, completed Sep 3, 2015 11:58:13 AM 

Error:(88, -1) Play 2 Compiler: 
missing parameter type for expanded function 
The argument types of an anonymous function must be fully known. (SLS 8.5) 
Expected type was: ? => ? 

случай класс:

case class H(
id: Option[Long] = None, 
idUser: Option[Long] = None, 
title: Option[String] = None, 
...) 

пятно стол:

class TH(tag: Tag) extends Table[H](tag, "H") { 

    def id = column[Long]("ID", O.PrimaryKey, O.AutoInc) 

    def idUser = column[Long]("ID_USER") 

    foreignKey("USER_FK", idUser, TableQuery[TUser])(_.id, onUpdate = ForeignKeyAction.Restrict, onDelete = ForeignKeyAction.Cascade) 

    def * = (id, idUser) <>({ 
    case (id: Option[Long], idUser: Option[Long]) => H(id, idUser) 
    }, { th: TH => Some((th.id, th.idUser)) }) 
} 
+0

Первое, что я вижу, что вы смешиваете Long и Option [Long]. Типы, заданные в '<>()', должны быть точно такими же, как вы определили в схемах Slick (с 'id' и' idUser'). Поэтому возможно '{case (id: Long, idUser: Long) => H (id = Some (id), idUser = Some (idUser))}, {th: Th => для {id <- th.id; idUser <- th.idUser} yield (id, idUser)} 'будет лучше. –

+1

Кажется, что синтаксис '{case (a, b, c) => X}' не работает, вы можете использовать alternaltive '{tuple: (A, B, C) => X}', поэтому в вашем app: '{tuple: (Long, Long) => H (Some (tuple._1), Some (tuple._2))}' –

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