使用slick和Sql Server存储过程时出现ClassCastException

时间:2016-03-23 15:49:27

标签: sql-server scala stored-procedures types slick

我有光滑的问题。它看起来像使用后scala不再是静态类型语言:)

我使用slick来调用一个应该返回一些值的SqlServer存储过程(当我直接在我的SQL客户端调用过程时它会这样做)。不幸的是,你可以在下面看到结果是我有一个类型为 Option [ProcessUserRoleDto] 的val,ProcessUserRoleDto只是一个普通的case类,实际上它的值是 Some(1) 和' 1'是 java.lang.Integer 类型。这怎么可能?您对如何解决此问题有任何想法吗?

case class ProcessUserRoleDto(
  processUserRoleId: Int,
  processUserId: Int,
  processRoleId: Int,
  dataCollectionId: Int,
  recognizingInstanceId: Int,
  processRoleName: String,
  dataCollectionName: String,
  recognizingInstanceName: String,
  isActive: Boolean)

def assign(dto: ProcessUserRoleAssignDto): Future[Option[ProcessUserRoleDto]] = {
  val db = implicitly[SQLServerDriver.backend.DatabaseDef]
  val sql = sql"exec EVO.spProcessUserRoleAssignToRecognizingInstance ${dto.ProcessUser_ID}, ${dto.ProcessRole_ID}, ${dto.RecognizingInstance_ID}"

  implicit val registerProcessUserResult = GetResult { r =>
        ProcessUserRoleDto(r.<<, r.<<, r.<<, r.<<, r.<<, r.<<, r.<<, r.<<, r.<<)
  }
  val resultFut: Future[Option[ProcessUserRoleDto]] = db
                                .run(sql.as[ProcessUserRoleDto])
                                .map(_.headOption)

  val singleResult: Option[ProcessUserRoleDto] = Await.result(resultFut, 10 seconds)

  println(s"singleResult = $singleResult")
  // in runtime result was: Some(1)
  // WTF ?!?

  println(s"class inside Some() = ${singleResult.get.getClass.getCanonicalName}")
  // in runtime result is: java.lang.Integer

  println(s"Option[Class] = ${singleResult.map(_.getClass.getCanonicalName)}")
  // here exception is thrown: java.lang.ClassCastException: java.lang.Integer cannot be cast to ProcessUserRoleDto
}

1 个答案:

答案 0 :(得分:0)

存储过程正在执行insert语句,然后执行select语句。我发现它混淆了JDBC驱动程序,因为插入返回了已修改记录的数量,并且添加了&#34; SET NOCOUNT ON&#34;到存储过程stoped(https://stackoverflow.com/a/4809815/1185138)。

仍然,光滑的悄悄搞砸了类型,而不是重新给出一个关于它的错误消息...