Cara valeu pela resposta tão rápido…
Bom, consulta dinamica…vamos ao que eu tenho pronto usando os filters da datatable…
@Override
public List<T> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
List<T> data = new ArrayList<T>();
String noneSelected = messageUtil.getMessageBundle("global.selecione");
// Criteria
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<T> accountQuery = criteriaBuilder.createQuery(entityClass);
// From
Root<T> from = accountQuery.from(entityClass);
// sort
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>();
for (Entry<String, String> entry : filters.entrySet()) {
//Selecione... não é um filtro válido :)
if(entry.getValue().equals(noneSelected)){
continue;
}
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();
// row count
CriteriaQuery<Long> countQuery = criteriaBuilder.createQuery(Long.class);
countQuery.select(criteriaBuilder.count(countQuery.from(entityClass)));
countQuery.where(predicates.toArray(new Predicate[predicates.size()]));
int rowCount = entityManager.createQuery(countQuery).getSingleResult().intValue();
setRowCount(rowCount);
return data;
}
Proximo passo é usar o MAP que vou colocar na sessão com os filtros…
Depois eu tenho que arrumar para funcionar com os JOINs né…
Imagine:
Classe Pessoa:
- Nome
- Idade
- Data nascimento
Esta classe tem relacionamento com:
Classe Cargo
e
Classe Animal
aí quero fazer um form que o cara pesquisa por:
Pessoa.Nome
Pessoa.Idade
Pessoa.DataNascimento
Cargo.descricao
Animal.apelido
Animal.raca
A consulta seria algo como:
Pessoa.Nome = valor OR Pessoa.Idade = valor OR Pessoa.DataNascimento = valor
AND
(Faz o join) Cargo.descricao = valor
AND
(Faz o join) Animal.apelido = valor OR Animal.raca = valor
Algo mais ou menos assim, só que dynamico… e genérico.
O que acha sobre isso? Tem sugestões?