Scala, sql интерполяция для кортежей - PullRequest
0 голосов
/ 10 октября 2018

У меня есть запрос, который выглядит примерно так в обычном sql

Select * from persons 
where (persons.first_name, persons.last_name) 
in (('a', 'b'), ('c', 'd'))

Я пытаюсь выполнить это изнутри scala

val names = List(("James", "hasi"), ("Michael", "Myers))
sql""" Select * from ${table}     where (first_name, last_name) IN ${names}""".stripMargin.map(...)

Однако он не выполняется, так как scalikejdbc не 'не знаю, как интерполировать кортеж.

"PSQLException: Can't infer the SQL type to use for an instance scala.Tuple2"

Есть идеи, как этого добиться?Думаю, я всегда могу преобразовать список кортежей в строку, но проблема в том, что scala обернет его одинарными кавычками, рассматривая все как строку.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Я опубликую это как ответ, потому что это решает проблему, но другим способом.Я закончил писать сырой SQL в scalikejdbc без экранирования кортежа "names"

. Это можно сделать с помощью класса SQLSyntax

val a = SQLSyntax.createUnsafely(names)
sql"${a}" <- not escaped
0 голосов
/ 10 октября 2018

Привет, у меня есть два предложения -

  1. Вы пробовали другие типы?Или вы должны использовать кортеж?Может быть, быстро попробовать последовательность или набор и т. Д.

  2. Также похоже, что вы используете необработанную интерполяцию.Я не уверен в используемом вами API, но похоже, что вы можете использовать только одну кавычку, например -

    sql"Select * from ${table} where (first_name, last_name) IN ${names}".stripMargin.map(...)

Редактировать:
Не могли бы вы попытаться нанести на карту список или это слишком смешно?Что-то вроде names.map((fname, lname) => sql""" Select * from ${table} where first_name = $fname and last_name = lname""".stripMargin).for(r <- rs) yield r

...