Гладкий запрос с отношением один ко многим - PullRequest
0 голосов
/ 25 октября 2018

Я использую slick 3.2.3 и пытаюсь создать запрос, который возвращает Seq[Entity1, Seq[Entity2]] для двух сущностей, которые имеют отношение один ко многим (для каждой сущности1 связаны несколько сущностей2).

Итак, у меня есть две сущности

case class Entity1(name: String, id: Option[Long] = None)
case class Entity2(entity1Id: Long, name: String, id: Option[Long] = None

с определениями таблиц (сгенерированные гладкой задачей codegen)

class entity1Table(_tableTag: Tag) extends profile.api.Table[Entity1](_tableTag, "ENTITY_1") {
   ...
}
lazy val groupTable = new TableQuery(tag => new groupTable(tag))

class entity2Table(_tableTag: Tag) extends profile.api.Table[Entity2](_tableTag, "ENTITY_2") {
   ...
}
lazy val entity2Table = new TableQuery(tag => new entity2Table(tag))

Чтение этой статьи I 'я создал запрос, подобный этому

val q = (for {
  e1 <- entity1Table
  e2 <- entity2Table if e2.entity1Id === e1.id
} yield (e1, e2)).groupBy(_._1) map {
  case (entity1, tuples) => (entity1, tuples.map(_._2))
}

db.run(q.result)

, но я получаю эту ошибку во время компиляции:

Error:(19, 35) No matching Shape found.
Slick does not know how to map the given types.
Possible causes: T in Table[T] does not match your * projection,
 you use an unsupported type in a Query (e.g. scala List),
 or you forgot to import a driver api into scope.
  Required level: slick.lifted.FlatShapeLevel
     Source type: (my.namespace.models.entity1Table, slick.lifted.Query[my.namespace.models.entity2Table,my.namespace.models.Entity2,[+A]Seq[A]])
   Unpacked type: T
     Packed type: G
    } yield (e1, e2)).groupBy(_._1) map {

Я подозреваю, что он не может сопоставить entity1Table и entity2Table.

Как я могу исправить ошибку?

1 Ответ

0 голосов
/ 26 октября 2018

Как указано в Slick doc , groupBy в настоящее время не поддерживает выполнение запроса со вложенными значениями типа Query:

Промежуточный запрос (т.е.запрос, завершенный groupBy () без агрегатной функции), содержит вложенные значения типа Query.Они превратятся во вложенные коллекции при выполнении запроса, который в данный момент не поддерживается.Поэтому необходимо немедленно сгладить вложенные запросы, агрегируя их значения (или отдельные столбцы)

Другими словами, ваш запрос Slick groupBy должен быть связан с агрегатной функцией, эквивалентной * 1012 SQL*, sum() и т. Д. Например, следующий запрос, эквивалентный select count(*) ... group by ... having count(*) > 1, будет работать:

val query = ( for {
    e1 <- entity1Table
    e2 <- entity2Table if e2.entity1Id === e1.id
  } yield (e1, e2)
).
groupBy(_._1).map{
  case (entity1, group) => (entity1, group.size)
}.
filter(_._2 > 1)
...