2013-04-10 55 views
0

Scala noob here;对于我的生活看不出为什么我没有得到这个Anorm SQL调用的结果。当我运行SQL调试输出时,它会返回一个结果,但是当通过代码运行时,我最终会得到一个空的List()。为什么这个Anorm结果是一个空列表? (Play 2.1.0)

我的RowParser有问题吗?为什么我在调试输出中看到好的SQL,但它不是由我的result val收集的?

我是否在我的SQL .as()中错过了某些内容以将结果行正确地映射到解析器?当我删除最后的result一行时,我的result val的计算结果为一个单位,这肯定是可疑的。

// Case class - SQL results rows go into List of these 
case class PerformanceData(
    date: String, 
    kwh: String 
) 

// RowParser 
val perfData = { 
    get[String]("reading_date") ~ get[String]("kwh") map{ 
     case reading_date~kwh => PerformanceData(reading_date, kwh) 
    } 
} 

// SQL Call - function ret type is Seq[PerformanceData] 
DB.withConnection("performance") { implicit connection => 

    val result: Seq[PerformanceData] = SQL(
    """ 
     SELECT CONCAT(reading_date) AS reading_date, 
      CONCAT(SUM(reading)) AS kwh 
     FROM perf 
     WHERE reading_date >= DATE_SUB(NOW(), INTERVAL 45 DAY) 
     AND sfoid IN ({sf_account_ids}) 
     GROUP BY reading_date 
     ORDER BY reading_date DESC 
     LIMIT 30 
    """ 
    ).on(
     'sf_account_ids -> getSQLInValues(SFAccountIDs) 
    ).as(
     User.perfData * 
    ) 

// Logger.debug(result.toString) -> EMPTY LIST!?? 
    result // Why is this necessary to return proper type? 

} 
+0

请参阅[这是我的答案](http://stackoverflow.com/questions/15864564/play-framework-2-0-correct-way-to-represent-a-set-in-a-query-using -anorm)关于Anorm中的'IN'子句。 – maba 2013-04-10 06:21:59

回答

2

不幸的是,您需要使用不绑定变量,而是替换IN子句的字符串值。

还看到:"In" clause in anorm?

编辑:我的意思是sf_account_ids将是一个单一的绑定varibale。也许sfoid IN (?, ?, ?)是预期的,但声明将是sfoid IN (?)

+0

这不是我的问题。 SQL渲染正常,调用获取ID列表可以防止错误的值 – Brian 2013-04-10 02:33:42

+0

或者你是否说如果我只是使用mkstring将SQL构造为字符串,SQL将无法运行?调试出的SQL可以手动运行。 – Brian 2013-04-10 02:39:42

+0

我的意思是说sf_account_ids将是一个单一的绑定varibale。也许'sfoid IN(?,?,?)'是预期的,但是这个语句将是'INF(IN)?'。 – 2013-04-10 09:55:12

0

对于第一个问题ID建议您检查case声明在perData并确保它是准确的。功能getSQLInValues(...)也可能是原因。

对于为什么你需要最后的result这个问题,这是因为scala使用闭包中的最后一个语句来推断未明确定义的返回类型。所以val result = SQ(...)作为一个任务将返回Unit

为了避免这种情况,你可以这样做:

DB.withConnection("performance") { implicit connection => 
    SQL(...).on(...).as(...) 
} 

通过不分配从SQL它被用来推断类型的回报。

相关问题