Slick 3.0 конвертирует Rep(Bind) в значение

Я пытаюсь присоединиться к двум таблицам, используя монадические соединения Slicks 3.0 следующим образом:

def getInfo(id: Int) = {

  val innerJoin = for {
    a <- tableA
    b <- tableB if a.id === b.s_id
  } yield b.name

  println(innerJoin) // results in Rep(Bind)

  innerJoin.map(println(_)) // results in Rep(Ref @1535257794)
}

Теперь я хочу получить значения из результатов соединения. Я много пытался получить значения, но это оказалось сложнее, чем я себе представлял. Я всегда получаю какой-то Rep(Bind), когда пытаюсь распечатать значения (см. комментарии выше).

Существует также это публикация, посвященная той же проблеме. Я попробовал предложенное решение, которое выглядит так:

innerJoin.map(c => c).forEach(id =>
  println(id)
)

Который даже не компилируется, так как forEach не определен в этом месте. Я действительно не знаю, как действовать здесь и что попробовать дальше. Кто-нибудь может мне помочь?

Спасибо...


person evermean    schedule 30.06.2015    source источник


Ответы (1)


val innerJoin в вашем коде — это гладкий запрос, который можно расширить/изменить или превратить в DBIOAction. Действие — это то, что может быть выполнено в базе данных, что в конечном итоге вернет ваши результаты:

val action = innerJoin.result
val results: Future[Seq[String]] = db.run(action)

// finally use map to access your result
results.map(s => s.map(name => ...)  // s is of type Seq[String]

Я предположил, что вы для понимания перенастраиваете String. Поэтому тип val results равен Future[Seq[String]].

Также взгляните на http://slick.typesafe.com/doc/3.0.0/dbio.html#executing-database-i-o-actions

person Roman    schedule 30.06.2015