Galera,
alguém já criou alguma consulta genérica para realizar filtros?
Vi um exemplo e estou utilizando, mas não estou gostando muito… pois só filtra Strings até o momento.
Alguém ja tem alguma coisa mais concreta implementada?
Quemn quiser ajudar a aprimorar, eis o código do que tenho:
// Criteria
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<T> accountQuery = criteriaBuilder.createQuery(entityClass);
// From
Root<T> from = accountQuery.from(entityClass);
// sortField veio do construtor deste método... Nada de mais.
if (sortField != null) {
if (sortOrder == SortOrder.ASCENDING) {
accountQuery.orderBy(criteriaBuilder.asc(from.get(sortField)));
} else {
accountQuery.orderBy(criteriaBuilder.desc(from.get(sortField)));
}
}
// filters
List<Predicate> predicates = new ArrayList<Predicate>();
//Ja deu pra perceber, recebo um Map com: key = campo value = valor_a_pesquisar.
for (Entry<String, String> entry : filters.entrySet()) {
//só pesquisa String.. seria legal se tivesse como fazer isto funcionar para INT, ENUM e até outras entidades (relacionamentos)....
Expression<String> literal = criteriaBuilder.literal( "%"+entry.getValue()+"%");
predicates.add(criteriaBuilder.like(from.<String> get(entry.getKey()), literal));
}
accountQuery.where(predicates.toArray(new Predicate[predicates.size()]));
// paginate
data = entityManager.createQuery(accountQuery).setFirstResult(first).setMaxResults(getPageSize()).getResultList();
Bom, se fosse pra fazer criando na unha o SQL dava até pra fazer… como n tenho mto conhecimento em JPA … tb n sei se da pra fazer.
Lembrando que a parada é genérica… talvez precisamos usar reflection e tal…
valeuuu