1

我有一个在普通 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 会用单引号将它包装起来,将所有内容都作为字符串处理。

4

2 回答 2

1

我会将其发布为答案,因为它解决了问题,但方式不同。我最终在 scalikejdbc 中编写了原始 SQL,而没有转义元组“名称”

您可以通过使用 SQLSyntax 类来做到这一点

val a = SQLSyntax.createUnsafely(names)
sql"${a}" <- not escaped
于 2018-10-11T15:29:42.633 回答
0

嗨,我有两个建议 -

  1. 你试过其他类型吗?还是必须使用元组?也许快速尝试一个序列或一个集合等。

  2. 此外,您似乎正在使用原始插值。我不确定您使用的 API,但看起来您可能只想使用一个引号,例如 -

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

编辑:
您可以尝试映射列表还是太hacky?就像是 names.map((fname, lname) => sql""" Select * from ${table} where first_name = $fname and last_name = lname""".stripMargin).for(r <- rs) yield r

于 2018-10-10T15:02:33.283 回答