0

Scala菜鸟在这里;对于我的生活,我无法理解为什么我没有得到这个 Anorm SQL 调用的结果。当我运行 SQL 调试输出时,它返回的结果很好,但是在运行代码时,我最终得到一个空的 List()。

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

我是否在我的 SQL 中遗漏了一些东西.as()来正确地将结果行映射到解析器?当我删除最后result一行时,我的resultval 评估为一个 Unit,这绝对是可疑的。

// 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?

}
4

2 回答 2

2

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

另请参阅:异常中的“In”子句?

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

于 2013-04-10T01:46:46.127 回答
0

对于第一个问题,id 建议您检查您的case陈述perData并确保其准确无误。功能getSQLInValues(...)也可能是原因。

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

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

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

通过不分配SQL它的返回值来推断类型。

于 2013-04-10T06:54:25.017 回答