Slick: фильтр с Rep [Seq [T]] - PullRequest
       26

Slick: фильтр с Rep [Seq [T]]

0 голосов
/ 08 мая 2018

Я работаю над Play!проект (в Scala), для которого я использую slick.

У меня возникла проблема при попытке отфильтровать запрос к столбцу jsonb, который содержит несколько массивов.

Например, мой столбец конфигурациисодержит следующий json:

{
 test1: {
   ...
 },
 test2: [
   {
    id: ...,
    bool: false
   },
   {
    id: ...,
    bool: true
   }
 ]
}

Я хочу запросить эту таблицу и выбрать каждую строку, для которой хотя бы один из элементов test2 имеет значение bool: true.(у нас может быть около 10 элементов в test2).

Я могу попробовать каждый элемент test2 1 на 1:

    baseQuery.filter(a => a.config+>'test2'~>0+>>'bool' === "true" ||
                          a.config+>'test2'~>1+>>'bool' === "true" ||
                          ...
                    )

Но это, очевидно, не хорошее решение.

Я пытался перейти с:

baseQuery.filter(a => (a.config+>'test2').arrayElements[JsArray].value...
                    )

Но у Rep [JsArray] нет метода значения.Я также пытался использовать

arrayElements[Seq[JsValue]]

Но я получаю Rep [Seq [JsValue]], на котором я не могу отобразить / flatMap / Существует /...

Это должно остатьсяЗапрос, а не DBIOAction, поэтому мне не нужно переформатировать много кода ...

Спасибо всем за ваши решения / идеи!

1 Ответ

0 голосов
/ 09 мая 2018

Я нашел какое-то "хакерское" решение, чтобы решить мою проблему.Я не совсем доволен этим, так как предпочел бы правильно перебирать Seq [JsValue], но здесь, если у кого-то такая же проблема.

Это довольно просто, я использую *Оператор 1003 * для получения моего JsValue в виде строки, а затем с помощью like проверьте, содержит ли он логическое значение, которое мне нужно установить в значение true.

В том же (глупом) примере, что и раньше, решение будет:

baseQuery.filter(_.config+>>'test2' like "%\"bool\": true%")

Возможно, это не лучшее решение, но оно работает для того, что мне нужно.

...