我想使用以下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]
这有什么问题吗?
使用普通的 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)