【问题标题】:How to get sum of a result from Mysql in scala with play framework?如何使用播放框架从 Scala 中的 Mysql 获取结果总和?
【发布时间】:2013-10-31 10:31:52
【问题描述】:

我正在开发简单的 scala web 应用程序,我正在运行一个查询,然后 play 应用程序给出异常

[RuntimeException: UnexpectedNullableFound(ColumnName(.SUM(score),Some(SUM(score)))]

play.api.Application$$anon$1: Execution exception[[RuntimeException: UnexpectedNullableFound(ColumnName(.SUM(score),Some(SUM(score))))]]
    at play.api.Application$class.handleError(Application.scala:289) ~[play_2.10.jar:2.1.2]
    at play.api.DefaultApplication.handleError(Application.scala:383) ~[play_2.10.jar:2.1.2]
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$18$$anonfun$apply$18.apply(PlayDefaultUpstreamHandler.scala:310) ~[play_2.10.jar:2.1.2]
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$18$$anonfun$apply$18.apply(PlayDefaultUpstreamHandler.scala:308) ~[play_2.10.jar:2.1.2]
    at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) ~[play_2.10.jar:2.1.2]
    at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) ~[play_2.10.jar:2.1.2]
Caused by: java.lang.RuntimeException: UnexpectedNullableFound(ColumnName(.SUM(score),Some(SUM(score))))
    at scala.sys.package$.error(package.scala:27) ~[scala-library.jar:na]
    at anorm.Sql$.as(Anorm.scala:535) ~[anorm_2.10.jar:2.1.2]
    at anorm.Sql$class.as(Anorm.scala:453) ~[anorm_2.10.jar:2.1.2]
    at anorm.SimpleSql.as(Anorm.scala:370) ~[anorm_2.10.jar:2.1.2]
    at models.Keyword$$anonfun$getBlogScore$1.apply(Keyword.scala:53) ~[na:na]
    at models.Keyword$$anonfun$getBlogScore$1.apply(Keyword.scala:52) ~[na:na]

models/keyword.scala

def getBlogScore(word: String, blog: String): Long={DB.withConnection{implicit c=>
 SQL("select SUM(score) from keyword where blog like {blog} and word = {word}").on('blog->blog,'word->word).as(scalar[Long].single)
}
}

我想根据某些条件得到分数列的总和。

给我一​​些想法来解决这个异常!

【问题讨论】:

  • 我认为,由于您的查询不能返回任何值,因此不能保证您会得到 Long,可能不存在需要用选项表示,因此您会得到 Option[Long]。不记得现在很难做到这一点,'scalar[Long].singleOpt' 也许?
  • 我试过scalar[Long].singleOpt,但仍然遇到同样的异常

标签: mysql scala playframework playframework-2.1 anorm


【解决方案1】:

试试:

SQL("select SUM(score) from keyword where blog like {blog} and word = {word}").
  on('blog->blog,'word->word).
  as(scalar[Option[Long]].single).
  getOrElse(0L)

【讨论】:

  • 当我提出您的查询时,它给出了运行时异常[RuntimeException: TypeDoesNotMatch(Cannot convert 1:class java.math.BigDecimal to Long for column ColumnName(.SUM(score),Some(SUM(score))))]
  • 我的查询运行良好SQL("select SUM(score) from keyword where blog like {blog} and word like {word}") .on('blog->blog,'word->word).as(get[Option[BigDecimal]]("SUM(score)").singleOpt.map{case Some(e)=>e}).getOrElse(0)
【解决方案2】:

我猜SUM 在没有匹配行时返回NULL。我也猜 在这种情况下你可能想要0

所以你必须处理这种情况。 Option 浮现在脑海中。快速浏览一下文档,搜索Option 表示有一个.singleOpt

所以你可以试试:

def getBlogScore(word: String, blog: String): Long = 
  DB.withConnection { implicit c =>
    SQL("select SUM(score) from keyword where blog like {blog} and word = {word}").
      on('blog->blog,'word->word).
      as(scalar[Long].singleOpt).
      getOrElse(0L)
  }

【讨论】:

    【解决方案3】:

    有点晚了,但这个问题已在 Anorm master 分支中修复:https://github.com/playframework/playframework/pull/2072

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-09
      • 2021-08-05
      • 2020-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多