Я пытаюсь создать конечную точку 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();
}