scala skunk 多参数查询:将列表作为参数传递给准备好的语句

问题描述 投票:0回答:1

我想使用以下sql查询数据库表

  val ALL_BY_ID: Query[List[String] *: Int *: EmptyTuple, Store] =
   sql"""SELECT id, name, description, account, enterdate
      ,  company, modelid
       FROM   store
       WHERE id  IN $varchar  AND  modelid = $int4 
       """.query(storeDecoder)

这是案例课

 final case class Store(
  id: String,name: String,description: String,account: String,enterdate: Instant,company: String,modelid: Int)

还有 storeDecoder

        val storeDecoder: Decoder[Store] = storeCodec.map {
case (id, name, description, account, enterdate, company, modelid) =>
  Store(id,name,description,account,toInstant(enterdate),company,modelid)}

这无法编译。 错误在这里

[error] 192 |    sql"""
[error] 193 |           SELECT id, name, description, account, enterdate, 
 [error] 195 |           WHERE id  IN $varchar  AND  modelid = $int4 
 [error] 196 |           """.query(storeDecoder)
 [error]     |    ^
 [error]     |Found:    skunk.Query[(String, Int), tradex.domain.model.store.Store]
 [error]     |Required: skunk.Query[(List[String], Int), tradex.domain.model.store.Store]

这有什么问题吗?

postgresql scala doobie
1个回答
0
投票

使用普通的 val 查询无法实现这一点。但是你可以使用片段来实现:

def ALL_BY_ID(lst: List[String], number: Int): AppliedFragment = {
  val query: Fragment[Void] =
    sql"""
      SELECT id, name, description, account, enterdate, company, modelid
      FROM store
    """
  query(Void) |+|
    AppliedFragment.apply[lst.type](sql" WHERE id IN(${varchar.list(lst)})", lst) |+|
    sql""" AND modelid = $int4""".apply(number)
}

然后这样称呼它:

val af = ALL_BY_ID(List("string", "string"), 1)
af.fragment.query(storeDecoder).queryList(af.argument)
© www.soinside.com 2019 - 2024. All rights reserved.