Это тот же вопрос, что и:
Как динамически генерировать SQL-запрос на основе выбора пользователя?
Единственное отличие состоит в том, что мне интересно видеть решения, использующие также Java / JPA (+, возможно, EclipseLink или специальные расширения Hibernate).
Мне нужно создать графический интерфейс, с помощью которого пользователи могут выбирать несколько атрибутов, которые будут использоваться для запроса базы данных, чтобы найти подходящих людей. Я ищу идеи, как динамически генерировать запрос к базе данных в соответствии с выбором пользователя.
Запрос будет содержать несколько полей, но чтобы понять, в качестве примера я приведу только три из них:
Занятие - может быть от 0 до n строк занятости. Если указаны строки занятия, одна из них должна соответствовать.
Возраст - возраст можно указать как:
- точное совпадение (30)
- диапазон (например, 30-40)
- меньше значения (-40)
- больше значения (30 -)
Параметр возраста является необязательным в запросе. Кроме того, пользователь может указать, является ли возраст обязательным параметром. Если это не требуется, и в его профиле не указан возраст, критерии возраста для этого человека игнорируются.
- Рост - аналогично возрасту
Примеры запросов:
Критерии не указаны:
select * from persons
Дано только занятие:
select * from persons where occupation = 'dentist'
Несколько профессий были даны:
select * from persons where (occupation = 'dentist' or occupation = 'engineer')
Возраст указан как значение, превышающее значение, и он должен существовать в профиле человека:
select * from persons where age >= 30
Рост указан как диапазон, и он не обязательно должен присутствовать в профиле человека:
select * from persons where (height is null or (height >= 30 and height <= 40))
Сочетание разных критериев:
select * from persons where occupation = 'dentist' and age >= 30 and (height is null or (height >= 30 and height <= 40))
Я уже реализовал код, который способен генерировать запросы в виде строк, но он, конечно, не слишком красив. Я ищу идеи, что было бы наиболее эффективным и красивым способом для достижения этой цели.