0

ここで Scala noob; この Anorm SQL 呼び出しの結果が得られない理由は、一生わかりません。SQL デバッグ出力を実行すると、問題なく結果が返されますが、コードを実行すると空の List() になります。

RowParser に問題はありますか? デバッグ出力に適切な SQL が表示されるのに、それがresultval によって収集されないのはなぜですか?

.as()結果行をパーサーに適切にマップするために、SQL に何か不足していますか? 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 句の文字列値を置き換える必要があります。

参照: anorm の "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 に答える