【问题标题】:Why is this Anorm Result an empty List? (Play 2.1.0)为什么这个异常结果是一个空列表? (玩2.1.0)
【发布时间】:2013-04-10 00:41:37
【问题描述】:

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

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

我是否在我的 SQL .as() 中遗漏了一些东西来正确地将结果行映射到解析器?当我删除最后一个 result 行时,我的 result val 评估为一个 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?

}

【问题讨论】:

标签: scala playframework-2.1 anorm


【解决方案1】:

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

另请参阅:"In" clause in anorm?

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

【讨论】:

  • 这不是我的问题。 SQL 呈现良好,获取 id 列表的调用可防止错误值
  • 或者您是说如果我只是使用 mkstring 将 SQL 构造为字符串,SQL 将不会运行?调试出的 SQL 手动运行良好。
  • 我的意思是 sf_account_ids 将是一个单一的绑定变量。也许sfoid IN (?, ?, ?) 是预期的,但声明将是sfoid IN (?)。
  • 您能否编辑您的答案,以便我投票并将其标记为答案?我错了,记录器正在生成完全有效的 SQL,但默默地未能发送查询并绑定它。解决方法是预先构造 SQL 查询,根本不使用绑定。我假设 CONCAT() 还允许我绑定到 RowParser 中的字符串,这也掩盖了一个问题。
【解决方案2】:

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

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

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

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

通过不从SQL 分配返回值,它用于推断类型。

【讨论】:

    猜你喜欢
    • 2014-04-23
    • 2012-11-08
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    相关资源
    最近更新 更多