in (select ef.entity_id
from entity_filter ef
inner join filter f on f.filter_id = ef.filter_id
WHERE ((f.filter_name='somefilter' AND ef.filter_value='somefiltervalue') OR
(f.filter_name='somefilter2' AND ef.filter_value='somefiltervalue2'))
group by ef.entity_id
HAVING COUNT(*) >= 2 -- number of matching attributes required
);
количество фильтров в where части меняются динамически ,и поэтому не понимаю как это можно написать. Сами полученные фильтры лежат в мапе. Есть идея только написать ручками генератор sql на основе мапы ,и впихнуть в where часть. Есть ли другие пути?
ну так они склеиваються, через and или or
самих фильтров может быть 50+. То есть статически написать в коде не получится. То есть может быть и такая ситуация: ... WHERE ((f.filter_name='somefilter' AND ef.filter_value='somefiltervalue') OR (f.filter_name='somefilter2' AND ef.filter_value='somefiltervalue2') OR (f.filter_name='somefilter3' AND ef.filter_value='somefiltervalue3') OR (f.filter_name='somefilter4' AND ef.filter_value='somefiltervalue4') ) group by ef.entity_id HAVING COUNT(*)>=4
а я где я сказал что их стптически написать ?
или у вас условия в текстовом виде ?
фильтры описаны в схеме graphql. Некоторые фильтры могут быть null ,и поэтому было принято достать не нулл фильтры через рефлекшн и запихнуть в мапу Map<String,String> где ключ это название фильтра
а значение это обычный SQL?
а в Мапе нужно использовать все фильтры или выборочно ?
https://www.jooq.org/doc/3.2/manual/sql-building/dynamic-sql/
слишком рано, нужно еще полгодика хоятб
Обсуждают сегодня