找不到参数c的隐式值:anorm.Column [Float]

时间:2014-04-28 12:13:04

标签: mysql sql scala playframework anorm

我得到了类似的问题,但它对我没有帮助。 (Anorm parse float values)。

我可以诚实地说我不理解这个问题的解决方案 我得到这个complie时间错误:

could not find implicit value for parameter c: anorm.Column[Float]

def getInformation(id: Long): List[(Float, Float, Float)] = {
    DB.withConnection { implicit con =>
      val query = SQL("select principal,interest,value from myTable where userId={id} and status=true").on("id"->id)
      val result = query().map { row =>
        Tuple3(row[Float]("principal"), row[Float]("inetrest"), row[Float]("value"))
       //      ^
      }.toList
      return result
    }
  }

4 个答案:

答案 0 :(得分:2)

也许对implicits的简短回顾可以帮助您。让我们构建一个非常基本的例子:

// some class which will be used as implicit (can be anything)
case class SomeImplicitInformation(maybe: Int, with: Int, data: Int)

// lets assume we have a function that requires an implicit
def functionRequiringImplicit(regularParameters: Int)(implicit imp: SomeImplicitInformation) {
  // ...
}

// now if you try to call the function without having an implicit in scope
// you would have to pass it explicitly as second parameter list:
functionRequiringImplicit(0)(SomeImplicitInformation(0,0,0))

// instead you can declare an implicit somewhere in your scope:
implicit val imp = SomeImplicitInformation(0,0,0)

// and now you can call:
functionRequiringImplicit(0)

您得到的错误只是说anorm.Column[Float]不在隐含范围内。您可以通过隐式添加到您的范围或明确传递它来解决它。

更详细的说明:由于Column随播广告对象仅为rowToDouble提供隐含,因此您只需使用the code that is linked in your question。要使它工作,请将其放在结果计算之前。稍后您可能希望将其放在某个封闭范围内的val中。

答案 1 :(得分:1)

试试这个......

def getInformation(id: Long): List[(Float, Float, Float)] = {
    DB.withConnection { implicit con =>
      val query = SQL("select principal,interest,value from myTable where userId={id} and status=true").on("id"->id)
      val result = query().map { row =>
        Tuple3(row[Float]("principal").asInstanceOf[Float], row[Float]("inetrest").asInstanceOf[Float], row[Float]("value").asInstanceOf[Float])
      }.toList
      return result
    }
  }

implicit def rowToFloat: Column[Float] = Column.nonNull { (value, meta) =>
val MetaDataItem(qualified, nullable, clazz) = meta
value match {
  case d: Float => Right(d)
  case _ => Left(TypeDoesNotMatch("Cannot convert " + value + ":" + value.asInstanceOf[AnyRef].getClass + " to Float for column " + qualified))
}
}

答案 2 :(得分:0)

有些函数可以接受我们称之为隐式参数的函数。在某些条件下,这些参数可以从上下文中导出。如果找不到这些参数,则必须手动指定它们。如果您希望将参数用作隐式参数,则必须将其声明为隐式参数,例如:

implicit val myVal = ...

它可以在当前块或封闭的块中完成(例如,在类体中,甚至有时在导入中)

您获得的错误似乎与此功能有关。您正在使用需要anorm.Column [Float]类型参数的函数。该参数被定义为隐式,因此可以使用隐式值,并且您的代码可能更简洁。不幸的是,您似乎在代码中没有这样的隐含值,因此它失败了。

答案 3 :(得分:0)

最新的Anorm(包含在Play 2.3中)提供了更多的数字转换(请参阅Play迁移说明中的http://applicius-en.tumblr.com/post/87829484643/anorm-whats-new-play-2-3&详细信息)。

如果您丢失了转换器,则可以在Play github项目中添加问题。

最佳