为什么这个Anorm结果是一个空列表? (播放2.1.0)

时间:2013-04-10 00:41:37

标签: scala playframework-2.1 anorm

斯卡拉诺布在这里;因为我的生活无法理解为什么我没有得到这个Anorm SQL调用的结果。当我运行SQL调试输出时,它返回一个结果就好了但是当运行代码时我最终得到一个空的List()。

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

我是否遗漏了SQL .as()中的内容,无法将结果行正确映射到Parser?当我删除最后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?

}

2 个答案:

答案 0 :(得分:2)

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

另见:"In" clause in anorm?

编辑:我的意思是sf_account_ids将是单个绑定变量。可能会sfoid IN (?, ?, ?),但声明为sfoid IN (?)

答案 1 :(得分:0)

对于第一个问题,建议您检查case中的perData声明并确保其准确无误。函数getSQLInValues(...)也可能是原因。

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

为避免这种情况,您可以执行以下操作:

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

如果不从SQL分配回报,则会用它来推断类型。