Можно ли использовать предложение IN в plain sql Slick?
Например, я хочу создать следующий запрос:
SELECT c.* FROM Coffees c WHERE c.name IN ('robusta', 'arabica')
Моя попытка не удалась:
val cnames = List("robusta", "arabica")
sql""" SELECT c.* FROM Coffees c WHERE c.name IN ${cnames} """
could not find implicit value for parameter pconv:
scala.slick.jdbc.SetParameter[List[String]]
Можно ли как-то использовать предложение in
в Slick
простых sql-запросах?
Ответы
Ответ 1
Я не вижу ничего из коробки, чтобы справиться с этим. Лучше всего, наверное, что-то вроде этого:
val cnames = List("robusta", "arabica").map("'" + _ + "'").mkString(",")
val query = sql""" SELECT c.* FROM Coffees c WHERE c.name IN (${cnames}) """
Ответ 2
Поддерживается также безопасный API-интерфейс "поднятого внедрения":
val ids = List(1,2,3)
val q = for {
f <- Foo if f.id inSet ids // ids is not bound
}
slick.typesafe.com/doc/1.0.1/api/index.html#scala.slick.lifted.ColumnExtensionMethods
Ответ 3
Хотя это не безопасно для SQL-инъекции, вы можете использовать интервал #$
:
val ids = idList.map("'" + _ + "'").mkString(",")
val q = sql"""select name from mytable where id in (#$ids)"""