Самый чистый способ получить список сущностей по отношению к другим с joinLeft с Slick - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь получить список сообщений, включая все вложения указанных сообщений. До сих пор мне приходилось выбирать объекты: MessageEntity и AttachmentEntity с внешним ключом от AttachmentsEntity до MessageEntity.

Я попытался сгруппировать эти два результата и отобразить их таким образом, чтобы каждое сообщение было связано с опцией списка вложений


val messages = TableQuery[MessageLifted]

val messagesAndAttachmentsLeftJoin = messages joinLeft piecesJointes on {
    (_msg, _pj) => _msg.id === _pj.idMessage
  }

val messagesAndAttachments = messagesAndAttachmentsLeftJoin .groupBy(_._1).map{ case (msg, req) => (msg, req.map(_._2)) }


def getMessagesConversation(isDemo: Boolean,
                              identifUser: String,
                              conversationId: String)(implicit messages: Messages): Future[List[Message]] = dbRepository.perform(isDemo) {
    val messages = messagesAndAttachments.result.map(_.map {
      case (message) => {
        entityToMessage(message)
      }
    }.toList)

Я ожидаю, что у меня будет объект типа List [tuple2 (Message, List [Attachment])]], но я получаю следующую ошибку:


/root/projects/digifact/server/digifact/app/repositories/digifact/messagerie/MessagerieRepository.scala:146: No matching Shape found.
[error] Slick does not know how to map the given types.
[error] Possible causes: T in Table[T] does not match your * projection,
[error]  you use an unsupported type in a Query (e.g. scala List),
[error]  or you forgot to import a driver api into scope.
[error]   Required level: slick.lifted.FlatShapeLevel
[error]      Source type: (repositories.digifact.documentation.MessageLifted, slick.lifted.Query[slick.lifted.Rep[Option[repositories.digifact.documentation.PieceJointeLifted]],Option[repositories.digifact.documentation.PieceJointeEntity],[+A]Seq[A]])
[error]    Unpacked type: T
[error]      Packed type: G
[error]   private val messagesAndAttachments = messagesAndAttachmentsLeftJoin.groupBy(_._1).map{ case (msg, req) => (msg, req.map(_._2))}

Любая помощь?

...