Estou desenvolvendo um sistema e busquei desenvolver um search que seja bastante genérico e possa ficar num DAO “pai de todos”…
Ainda está dando uns paus e estou tentando resolver…
[code]
@SuppressWarnings(“unchecked”)
protected List<?> searchAsc(String busca, Class classe, String[] campos,
String[] ordens) {
LOGGER.debug("busca = " + busca + " - campo = " + campos
+ " - classe = " + classe.getName() + " - total de ordens = "
+ ordens.length);
crit = getSession().createCriteria(classe);
Disjunction disjunction = Restrictions.disjunction();
List<String> alias = new ArrayList<String>();
String aClass = "";
String aClassAlias = "";
String campo = "";
String ordem = "";
// Gera uma lista de alias para campo
for (int i = 0; i < campos.length; i++) {
LOGGER.info(campos);
LOGGER.info(alias);
aClassAlias = "";
campo = campos[i];
// Adiciona uma restrição usando alias
if (campos[i].split("\\.").length > 1) {
LOGGER.info("precisa de alias - " + campos[i]);
aClass = (campos[i].split("\\.")[0]);
aClassAlias = aClass.substring(0, 3);
campo = campos[i].split("\\.", 2)[1];
LOGGER.info("aClass = " + aClass + " - " + "aClassAlias = " + aClassAlias);
// Verifica se já foi encontrada uma mesma classe
// Se não foi, adiciona o alias
if (!alias.contains(aClass)) {
alias.add(aClass);
LOGGER.info("alias novo");
crit.createAlias(aClass, aClassAlias);
LOGGER.info(alias);
}
aClassAlias = aClassAlias + ".";
}
//Adiciona a restrição a um disjunction (OR)
disjunction.add(Restrictions.like(aClassAlias + campo, "%" + busca + "%"));
}
//adiciona o disjunction à criteria
crit.add(disjunction);
// Gera uma lista de alias para ordem
for (int i = 0; i < ordens.length; i++) {
LOGGER.info(ordens);
LOGGER.info(alias);
aClassAlias = "";
ordem = ordens[i];
// Adiciona uma restrição usando alias
if (ordens[i].split("\\.").length > 1) {
LOGGER.info("precisa de alias - " + ordens[i]);
aClass = (ordens[i].split("\\.")[0]);
aClassAlias = aClass.substring(0, 3);
ordem = ordens[i].split("\\.", 2)[1];
LOGGER.info("aClass = " + aClass + " - " + "aClassAlias = " + aClassAlias);
// Verifica se já foi encontrada uma mesma classe
// Se não foi, adiciona o alias
if (!alias.contains(aClass)) {
alias.add(aClass);
LOGGER.info("alias novo");
crit.createAlias(aClass, aClassAlias);
LOGGER.info(alias);
}
aClassAlias = aClassAlias + ".";
}
//Adiciona a restrição
crit.addOrder(Order.asc(aClassAlias + ordem));
}
return crit.list();
}[/code]
Um exemplo desse método sendo chamado segue abaixo:
searchAsc(nome, Grupo.class, new String[] {"empresa.nome", "nome"}, new String[] {"empresa.nome", "nome"});
O pau que está dando é quando são instanciados mais de dois níveis na chamada… preciso criar um outro alias.