code: @Override
  	public synchronized List<T> filter(List<Predicate> predicates, Map<String, OrderType> orders, Set<String> properties, int firstResult, int maxResult) {
  		
  		// Criteria Builder
  		CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
  		
  		// Requete de criteres
  		CriteriaQuery<T>criteriaQuery = criteriaBuilder.createQuery(entityClass);
  		
  		// Construction de la racine
  		Root<T> root = criteriaQuery.from(entityClass);
  		
  		// On positionne l'Alias
  		root.alias(ROOT_ALIAS);
  		
  		// Selection de la racine
  		criteriaQuery.select(root);
  		
  		// Ajout des Prédicats
  		addPredicates(criteriaBuilder, root, criteriaQuery, predicates);
  		
  		// Ajout des Odres
  		addOrders(criteriaBuilder, root, criteriaQuery, orders);
  		
  		// Ajout des Modes de chargements
  		addProperties(root, criteriaQuery, properties);
  		
  		// Construction de la requete basée sur les critères
  		TypedQuery<T> query = getEntityManager().createQuery(criteriaQuery);
  		
  		// Traitement de l'index du premier resultat
  		
  		// Si l'index du premier element est < 0
  		if(firstResult < 0) query.setFirstResult(0);
  		else query.setFirstResult(firstResult);
  		
  		// Traitement du nombre max de resultat
  		
  		// Si le nombre max d'element est <= 0
  		if(maxResult > 0) query.setMaxResults(maxResult);
  		
  		// Execution
  		List<T> results = query.getResultList();
  		
  		// On retourne le résultat
  		return results;
  	}
docs: /*
  (non-Javadoc)
  @see net.leadware.persistence.tools.core.dao.JPAGenericDAO#filter(java.util.List, java.util.Map, java.util.Set, int, int)