Попробуйте этот путь: удалите все .class файлы в ваших каталогах проектов (и, конечно же, все подкаталоги). Rebuild.
Иногда mvn clean
(если вы используете maven) не очищает файлы .class, созданные вручную javac
. И эти старые файлы содержат старые подписи, что приводит к NoSuchMethodError
.
Предположения:
{"serie": 5}
. Могут быть другие . Краткий ответ: используйте jsonb
вместо json
, и это работает:
User.where("groups @> ?", '[{"serie": 5}]')
Обратите внимание на квадратные скобки для сделайте правый операнд массивом JSON .
Значительное недоразумение здесь: тип данных json
- это не то же самое как jsonb
.
Вы не объявили фактическое определение таблицы, но вы позже прокомментировали json
, и в вопросе есть намек:
blockquote>select json_array_elements(groups -> 'data') ->> 'serie' from users;
json_array_elements()
работает только дляjson
, дляjsonb
должно бытьjsonb_array_elements()
. Но вы пытаетесь использоватьjsonb
Operators@>
, что невозможно дляjson
:blockquote>groups -> 'data' @> '?'
оператор
->
возвращает тот же тип, что и левый вход. Но@>
определяется только дляjsonb
, а не дляjson
.Затем вы пытаетесь использовать оператор
@>
дляtext
как левый операнд. Невозможно:blockquote>groups ->> 'data' @> ?
Существуют варианты оператора
@>
для разных типов (включая массивы Postgres), но не дляtext
, а не дляjson
.Итак, короткий ответ: используйте
jsonb
вместоjson
. Это также позволяет использовать очень эффективные индексы:
json
Для типа данных
json
вы можете использовать:SELECT * FROM users u WHERE EXISTS ( SELECT 1 FROM json_array_elements(u.groups) elem WHERE elem ->> 'serie' = '5' );
Демос
jsonb
:SELECT * FROM ( VALUES (1, jsonb '[{"serie":5, "year":3, "specialization":"Matematica", "management_id":1, "group_number":2} , {"serie":5, "year":3, "specialization":"Matematica", "management_id":1, "group_number":2}]') , (2, '[{"serie":7, "year":3, "specialization":"Matematica", "management_id":1, "group_number":2} , {"serie":8, "year":3, "specialization":"Matematica", "management_id":1, "group_number":2}]') , (3, '[{"serie":9, "year":3, "specialization":"Matematica", "management_id":1, "group_number":2} , {"serie":5, "year":3, "specialization":"Matematica", "management_id":1, "group_number":2}]') ) users(id, groups) WHERE groups @> '[{"serie": 5}]';
json
:SELECT * FROM ( VALUES (1, json '[{"serie":5, "year":3, "specialization":"Matematica", "management_id":1, "group_number":2} , {"serie":5, "year":3, "specialization":"Matematica", "management_id":1, "group_number":2}]') , (2, '[{"serie":7, "year":3, "specialization":"Matematica", "management_id":1, "group_number":2} , {"serie":8, "year":3, "specialization":"Matematica", "management_id":1, "group_number":2}]') , (3, '[{"serie":9, "year":3, "specialization":"Matematica", "management_id":1, "group_number":2} , {"serie":5, "year":3, "specialization":"Matematica", "management_id":1, "group_number":2}]') ) users(id, groups) WHERE EXISTS ( SELECT 1 FROM json_array_elements(users.groups) elem WHERE elem ->> 'serie' = '5' );