2013-10-31 24 views
0

我的工作簡單的Scala Web App和我運行一個查詢,然後播放應用程序所賜例外如何在scala中使用play framework從Mysql得到結果的總和?

[RuntimeException的:UnexpectedNullableFound(的ColumnName(.SUM(得分),有些(SUM(得分)))) ]

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] 

型號/ 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) 
} 
} 

我想基於一些條件得分列的總和。

給我一些想法來解決這個異常!

+0

我覺得,既然你的查詢可以返回沒有值不能保證你會得到一個Long,可能不需要用一個選項來表示,所以你得到Option [Long]。不記得現在如何做到這一點,可能是'scalar [Long] .singleOpt'? – johanandren

+0

我試過'標量[Long] .singleOpt',但仍然得到相同的異常 –

回答

0

我猜SUM返回NULL當沒有行匹配。我也猜測 你可能需要0在這種情況下。

所以你必須處理這種情況。想起了Option。快速查看文檔,grep 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) 
    } 
+0

我試過你的解決方案,但仍然得到相同的異常 –

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) 
+0

當我把你的查詢然後它給運行時異常''[RuntimeException:TypeDoesNotMatch(Can not convert 1:class我的查詢工作正常'SQL(「從關鍵字選擇SUM(分數)在哪裏博客像{{(分數),一些(SUM(分數)))))' –

+1

{ ('blog-> blog,'word-> word).as(get [Option [BigDecimal]](「SUM(score)」)。singleOpt.map {case一些(E)=>電子})。getOrElse(0)' –

相關問題