Почему этот 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
он используется для определения типа.