Запрос внутри столбца JSONB динамически с помощью entityManager.createNativeQuery в Java - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь создать конечную точку REST для запроса Postgresql JSONB столбца с именем data. Структура документа JSONB не является фиксированной, и каждый документ может иметь собственную структуру. URL-адрес Rest api может быть примерно таким: /api/lookups?search=name:location, где name - другой столбец varchar(250).

Я сослался на учебное пособие Баэльдуна по динамическим запросам с использованием Спецификации.

Однако мне нужно запросить элементы внутри моего столбца jsonb.

Есть ли способ, которым я могу создать логику для обработки всех возможных сценариев, которые успешно преобразуют мой параметр запроса покоя в запрос natice?

Это также может быть список возможных сценариев, таких как @>, ->, ->> и другие операторы, которые могут быть сопоставлены с помощью регулярного выражения при поиске параметров запроса.

Любая помощь приветствуется. Если вы можете указать мне на возможный дубликат вопроса, я был бы очень благодарен.

Я искал некоторые учебники / примеры по этому же вопросу и нашел этот вопрос очень полезным, теперь я уверен, что мне нужно использовать createNativeQuery для достижения этой цели. Однако я хотел бы сделать это динамически на основе параметра request .

Таблица содержит

 [ {
  "id" : 1001,
  "name" : "location",
  "data" : {
    "country" : "india"
  "state":["delhi","karnataka","goa"]}
}, {
  "id" : 1002,
  "name" : "location",
  "data" : {
    "country" : "sri lanka"
  "state":["trishi","sri raman","colombo"]
  },
{
  "id" : 1003,
  "name" : "location",
  "data" : {
    "country" : "india"
  "language":["english","tamil","kannada", "telugu"]}
}
]

например, если мой URL-адрес /api/lookups?search=name:location,data.country:india

Мне нужно получить все записи, в которых ключ данных равен country, а значение страны - india.

аналогично, если мой URL равен /api/lookups?search=name:location,data.country:india,data.country.state:delhi

Было бы также полезно, если бы я мог включить подобные шаблоны.

например, /api/lookups?search=name:location,data.country:india,data.country.state:*karna*

Также

/api/lookups?search=name:location,data.coun*:ind*,data.country.sta*:delhi

Мне нужно охватить все эти возможные сценарии, чтобы запускать динамические запросы из остальной конечной точки.

Редактировать:

для URL

/api/lookups?search=name:pesticide,name:fertilizer,data.details.state:solid|liquid

сгенерированный NativeQuery должен выглядеть примерно так:

 public List<Lookup> search(String filter) {
        return (List<Lookup>) entityManager.createNativeQuery(
                "select * from farm.lookup where data @>'{\"details\":{\"state\": [\"solid\",\"liquid\"]}}' or name ='pesticide' or name = 'fertilizer'",
                Lookup.class).getResultList();
    }
...