浮华的未来和选择

时间:2018-10-13 23:17:36

标签: scala slick

我在使用slick方面还很陌生,现在遇到了如何从两个表中检索一些数据的问题。 我有一张桌子

class ExecutionTable(tag: Tag) extends Table[ExecTuple](tag, "execution") {
  val id: Rep[String] = column[String]("id")
  val executionDefinitionId: Rep[Long] = column[Long]("executionDefinitionId")
  // other fields are omitted

  def * = ???
}

和另一个表格

class ServiceStatusTable(tag: Tag)
  extends Table[(String, Option[String])](tag, "serviceStatus") {
  def serviceId: Rep[String] = column[String]("serviceId")
  def detail: Rep[String] = column[String]("detail")

  def * = (serviceId, detail.?)
}

在Dao中,我将这两个表中的数据转换为业务对象

case class ServiceStatus(
  id: String, 
  detail: Option[String] = None, //other fields
)

像这样

private lazy val getServiceStatusCompiled = Compiled {
  (id: Rep[String], tenantId: Rep[String]) =>
  for {
    exec   <- getExecutionById(id, tenantId)
    status <- serviceStatuses if exec.id === status.serviceId
  } yield mapToServiceStatus(exec, status)
}

及以后

def getServiceStatus(id: String, tenantId: String)
: Future[Option[ServiceStatus]] = db
  .run(getServiceStatusCompiled(id, tenantId).result.transactionally)
  .map(_.headOption)

问题在于,表execution中的表中不存在表serviceStatus中的所有条目。我无法修改表execution并将其添加到字段details中,因为它仅是特定于服务的。 当我运行查询以防execution中存在来自serviceStatus的条目时,所有条目均按预期工作。但是,如果serviceStatus中没有条目,则返回Future [None]。 问题:是否有任何选项可以根据表status中的现有条目或其他解决方法来获得serviceStatus作为选项的理解?

1 个答案:

答案 0 :(得分:1)

通常,如果联接条件未在“右”表中找到相应记录,但结果仍应包含“左”表中的行,则使用左联接。 在您的情况下,您可以执行以下操作:

Execution
  .filter(...execution table filter...)
  .joinLeft(ServiceStatus).on(_.id===_.serviceId)

这给您一对

(Execution, Rep[Option[ServiceStatus]]) 

查询执行后:

(Execution, Option[ServiceStatus])