2013-04-10 60 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它被用來推斷類型的回報。

相關問題