Два подхода:
1 .. В зависимости от того, какой тип фильтрации вам необходим, вы можете достичь этого, выполнив поиск, например, индексирования всех объектов с помощью Lucene, а затем используйте поисковые запросы для выполнения фильтрации.например, создать запрос типа:
title: "The Right Way" & mod_date: [20020101 TO 20030101]
См .: http://lucene.apache.org/java/2_4_0/queryparsersyntax.html
2.Или используя критерии ...
Я бы использовал новые безопасные для типов критерии api из hibernate:
http://relation.to/12805.lace
Вместо одного метода, который создаеточень большие критерии, я бы попытался отделить всю логику, используя отдельные критерии -
http://docs.jboss.org/hibernate/core/3.5/reference/en/html/querycriteria.html#querycriteria-detachedqueries
С комбинацией этих двух вы сможете легко создать критерии.
Еще одно место, где можно найти вдохновение - это динамические искатели Grails.По сути, это то, чего вы пытаетесь достичь статическим способом.
http://www.grails.org/doc/1.0.x/guide/single.html#5.4.1 Динамические искатели
Если вы действительно хотите полное разделение слоев, вы можете реализовать простую грамматику.Затем проанализируйте это, чтобы создать соответствующие критерии.Это позволит изменить базовые критерии реализации.Уместно ли это, зависит от того, насколько важна для вас эта абстракция.