Насколько я знаю, нет "хорошего способа" сделать это (если вы хотите сохранить тип), но вы можете использовать одно из следующих решений:
0.Переключатель регистра обычно я действительно против switch
и case
в Java
, но у него есть свое место ... Самое простое решение - создать запрос в отдельных случаях ... ониэто отдельные случаи (каламбур не предназначен).
Исходя из вашего вопроса, я предполагаю, что у вас гораздо более сложная структура, чем представленная, поэтому далее у меня есть два возможных решения для вас.
1.Программное решение Вы можете создать решение на основе отражения.У вас может быть полное решение, реализующее некоторую интересную логику.В основном у вас должен быть список из объектов, которые «доступны для поиска» в этой функции.В цикле вы можете использовать отражение, чтобы определить, является ли поле «приемлемым» в сущности.(Например, «сток» допустим только в PRODUCT_A
, поэтому создание критериев будет основано на этом Entity
. Я определенно не рекомендую этот подход , так как это может создать много проблем.(Например, как бы вы справились, если в вашем DTO одновременно установлены stock
и featured
?
2. Создать представление для построения поиска в основномВы создаете представление базы данных и сущность в Spring, имеющую все возможные параметры.
Исходные таблицы:
|TABLE_A | |TABLE_B |
|ID|FIELD_A| |ID|FIELD_B|
|__________| |__________|
| 1|EXAMPLE| | 1| STUFF|
Представление:
|COMBINED_VIEW |
|ID|FIELD_A|FIELD_B|ORIG_TABLE|
|_____________________________|
| 1|EXAMPLE| null| TABLE_A|
| 1| null| STUFF| TABLE_B|
Создание:
SELECT
ID as id, FIELD_A as field_a, null as field_b, 'TABLE_A' as ORIG_TABLE
FROM TABLE_A
UNION ALL
SELECT
ID as id, null as field_a, FIELD_B as field_b, 'TABLE_B' as ORIG_TABLE
FROM TABLE_B
Будьте осторожны, хотя поле идентификатора может запутать вас, если вы используете кэширование, добавите сгенерированный идентификатор или включите ORIG_TABLE
в ваше отображение @Id
.
TL.DR.: Второй способ, которым вы можете отобразить все, что вам нужно, и (по моему мнению), это приемлемый способ получить результаты.хороший момент, который вы не должны принимать во внимание, если задано больше параметров вопроса, чемвозможно для одного entity
.(Например: FIELD_A='EXAMPLE' AND FIELD_B='STUFF'
просто не будет никакого результата.) Хотя есть и другие способы для достижения этой цели, такие как JPQL
и левое соединение и отображение конструктора Я думаю, что второй вариант является наиболее понятным и наиболееремонтопригодный.