روش درست برای اعمال یک یا چند فیلتر آن است که فیلتر (های) مورد نظر را به بخش Restriction (Where Clause) کوئری اضافه نمائیم و اجازه دهیم که اعمال تمامی فیلترها توسط DBMS مدیریت شود. برای اینکار می توان متد fillCriteria را در کلاس Dao مورد نظر Override کرد:
@Override
protected void fillCriteria(CriteriaQuery criteria, Root<GeoUnitEntity> root, SearchFilter<Object> searchFilter,
String sortProperty, boolean sortAscending, JpaCriteriaAssociationMap criteriaAssociationMap) {
super.fillCriteria(criteria, root, searchFilter, sortProperty, sortAscending, criteriaAssociationMap);
CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
// Create subquery here ...
Predicate notExists = cb.not(cb.exists(subquery));
criteria.where(cb.and(criteria.getRestriction(), notExists));
}
برای ایجاد subquery مورد نیاز خود می توانید از https://stackoverflow.com/questions/13859780/building-a-query-using-not-exists-in-jpa-criteria-api کمک بگیرید.