Существует простой и элегантный способ решения этой задачи: сочетание SQL/HQL и движков шаблонов.
Не смотрели в сторону Specifications? По моему это намного более элегантное решение, чем генерация руками запроса для такого кейса, особенно с метамоделью.
Смотрел, лучше чем критерии, но всё равно годится для сравнительно простых случаев. Если есть задача, когда, допустим в зависимости от входных данных нужно присоединять некую таблицу и отсеивать выборку по полю этой таблицы, то спецификации всё равно получаются довольно громоздкими, КМК.
Spring Data JPA: доводим напильником