Slick-pg: Как использовать arrayElementsText и оператор перекрытия "? |"? - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь написать следующий запрос в 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"]}  | 
...