Я пытаюсь написать следующий запрос в scala , используя slick / slick-pg , но у меня нет большого опыта работы с slick ине могу понять, как:
SELECT *
FROM attributes a
WHERE a.other_id = 10
and ARRAY(SELECT jsonb_array_elements_text(a.value->'value'))
&& array['1','30','205'];
Это упрощенная версия таблицы attribute , где поле value представляет собой jsonb :
class Attributes(tag: Tag) extends Table[Attribute](tag, "ship_attributes") {
def id = column[Int]("id")
def other_id = column[Int]("other_id")
def value = column[Json]("value")
def * = (id, other_id, value) <> (Attribute.tupled, Attribute.unapply)
}
Пример данных:
| id | other_id | value |
|:-----|:-----------|:------------------------------------------|
| 1 | 10 | {"type": "IdList", "value": [1, 21]} |
| 2 | 10 | {"type": "IdList", "value": [5, 30]} |
| 3 | 10 | {"type": "IdList", "value": [7, 36]} |
Это мой текущий запрос:
attributes
.filter(_.other_id = 10)
.filter { a =>
val innerQuery = attributes.map { _ =>
a.+>"value".arrayElementsText
}.to[List]
innerQuery @& List("1", "30", "205").bind
}
Но он жалуется на.to[List]
преобразование.
Я пытался создать SimpleFunction.unary[X, List[String]]("ARRAY")
, но я не знаю, как передать ему innerQuery
(innerQuery
- Query[Rep[String], String, Seq]
).
Любые идеи очень ценятся.
ОБНОВЛЕНИЕ 1
, хотя я не могу понять это, я изменил приложение, чтобы сохранить в базе данных поле jsonв виде списка строк вместо целого числа, чтобы можно было выполнить этот простой запрос:
attributes
.filter(_.other_id = 10)
.filter(_.+>"value" ?| List("1", "30", "205").bind)
| id | other_id | value |
|:-----|:-----------|:------------------------------------------|
| 1 | 10 | {"type": "IdList", "value": ["1", "21"]} |
| 2 | 10 | {"type": "IdList", "value": ["5", "30"]} |
| 3 | 10 | {"type": "IdList", "value": ["7", "36"]} |