Почему этот Anorm Result пустой список? (Играть 2.1.0)

Скала нуб здесь; поскольку я не могу понять, почему я не получаю результат для этого вызова Anorm SQL. Когда я запускаю выходные данные отладки SQL, он прекрасно возвращает результат, но при запуске через код я получаю пустой List().

Есть ли проблема с моим RowParser? Почему я вижу хороший SQL в выводе отладки, но он не собирается моим result Вэл?

Я что-то упустил в моем SQL .as() правильно отобразить строки результатов в Parser? Когда я удаляю последний 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?

}

2 ответа

Решение

К сожалению, вам нужно использовать не переменные связывания, а заменять их в строковом значении для предложения IN.

см. также: "В" в анорме?

Изменить: я имел в виду, что sf_account_ids будет один вариант связывания. Может быть sfoid IN (?, ?, ?) ожидается, но заявление будет sfoid IN (?),

По первому вопросу вы можете проверить свой case заявление в perDataи убедитесь, что это точно. Функция getSQLInValues(...) также может быть причиной.

На вопрос, зачем вам последний result и это потому, что scala использует последний оператор в замыкании, чтобы вывести тип возвращаемого значения, если оно явно не определено. Так val result = SQ(...) будучи назначением вернется Unit

Чтобы избежать этого, вы можете сделать что-то вроде:

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

Не назначая возврат от SQL он используется для определения типа.

Другие вопросы по тегам