Scala Slick - 查询结果的无限递归(StackOverflowError)

时间:2016-05-31 06:46:50

标签: scala post recursion stack-overflow slick

我在Twitter Finatra应用程序上玩Slick。最后我想我做到了但是现在,当我想处理结果时,我总是得到一个递归错误。我环顾四周,但没有找到任何有用的特殊问题。我的代码实际上非常简单:

将Database类映射到自定义类型:

package com.configurationManagement.library

package object Types {
  type SlickDatabase = slick.driver.MySQLDriver.api.Database
}

型号:

package com.configurationManagement.app.domain

import slick.lifted.Tag
import slick.driver.MySQLDriver.api._
import slick.profile.SqlProfile.ColumnOption.NotNull

case class ConfigurationTemplate(id: Option[Int], name: String)

class ConfigurationTemplates(tag: Tag) extends Table[ConfigurationTemplate](tag: Tag, "configuration_template") {
  def id = column[Int]("id", O.AutoInc, O.PrimaryKey)
  def name = column[String]("name", NotNull)
  def uniqueNameIndex = index("unique_name", name, unique = true)

  def * = (id.?, name) <> (ConfigurationTemplate.tupled, ConfigurationTemplate.unapply)
}

控制器:

package com.configurationManagement.app.controller

import com.google.inject.{Inject, Singleton}
import com.configurationManagement.app.domain.ConfigurationTemplates
import com.configurationManagement.app.dto.request.RequestConfigurationTemplateDto
import com.configurationManagement.library.Types._
import com.twitter.finatra.http.Controller
import com.twitter.inject.Logging
import slick.driver.MySQLDriver.api._

@Singleton
class ConfigurationTemplateController @Inject()(database: SlickDatabase)
  extends Controller with Logging with FutureConverter {

  post("/configurations/templates") { dto: RequestConfigurationTemplateDto =>
    val templates = TableQuery[ConfigurationTemplates]
    val query = templates.filter(_.id === 1)
    response.ok(query.map(_.name))
  }
}

这里出现了错误

Infinite recursion (StackOverflowError) (through reference chain: com.configurationManagement.app.domain.ConfigurationTemplates["table_node"]->slick.ast.TableNode["driver_table"]->com.configurationManagement.app.domain.ConfigurationTemplates["table_node"]->slick.ast.TableNode["driver_table"]->com.configurationManagement.app.domain.ConfigurationTemplates["table_node"]->slick.ast.TableNode["driver_table"]->com.configurationManagement.app.domain.ConfigurationTemplates["table_node"]->slick.ast.TableNode["driver_table"]->com.configurationManagement.app.domain.ConfigurationTemplates["table_node"]->slick.ast.TableNode["driver_table"]->com.configurationManagement.app.domain.ConfigurationTemplates["table_node"]->slick.ast.TableNode["driver_table"]->com.configurationManagement.app.domain.ConfigurationTemplates["table_node"]->slick.ast.TableNode["driver_table"]->com.configurationManagement.app.domain.ConfigurationTemplates["table_node"]->slick.ast

很明显,这一行会导致错误:

query.map(_.name)

1 个答案:

答案 0 :(得分:1)

我看到的两件事情,首先你需要将.result添加到查询中以将其转换为FixedSqlStreamingAction,其次你需要一个数据库来运行该查询:

private[this] val database: slick.driver.MySQLDriver.backend.DatabaseDef = Database.forDataSource(...)

database.run(templates.filter(_.id === 1).map(_.name).result)

返回Future[Seq[String]],这可能是response.ok的预期类型。