Boa tarde galera, seguinte, há alguma possibilidade de fazer esse procedimento.
[code] Criteria crt = this.session.createCriteria(Advogado.class);
crt.createAlias("estado","estado");
crt.add(Restrictions.ilike("estado.descricao", "%"+textoBusca+"%"));[/code]
Utilizando sqlRestrictions?
Explico meu motivo, eu possuo um metodo na minha dao que faz pesquisa automática por todos os campos da minha tabela, e essa pesquisa tem que ser genérica para qualquer tabela e qualquer campo, e não consegui fazer isso usando os métodos padroes de restrictions.
Fiz o seguinte método.
public List<IBean> listaTudo(Class classe,Criteria crt,int page, int rows, String order,
String sort, String campoBusca, int tipoBusca,String textoBusca, String todosCampos, Boolean exclusaoVirtual) {
//Instancia a Criteria de busca
if((page !=0)&&(rows != 0)){
crt.setFirstResult((page - 1) * rows).setMaxResults(rows);
}
String[] arrayAllFields = null;
//Verifica se foi passada ordenacao
if ((order != null) && (sort != null)) {
if ("desc".equals(order)) {
crt.addOrder(Order.desc(sort));
} else {
crt.addOrder(Order.asc(sort));
}
}
if(textoBusca != null){
if(!campoBusca.equals("Automático")){
switch (tipoBusca) {
case 0:
crt.add(Restrictions.sqlRestriction(campoBusca+" = ?",textoBusca,StringType.INSTANCE));
break;
case 1:
crt.add(Restrictions.sqlRestriction(campoBusca+" <> ?",textoBusca,StringType.INSTANCE));
break;
case 2:
crt.add(Restrictions.sqlRestriction(campoBusca+" < ?",textoBusca,StringType.INSTANCE));
break;
case 3:
crt.add(Restrictions.sqlRestriction(campoBusca+" > ?",textoBusca,StringType.INSTANCE));
break;
case 4:
crt.add(Restrictions.sqlRestriction(campoBusca+" >= ?",textoBusca,StringType.INSTANCE));
break;
case 5:
crt.add(Restrictions.sqlRestriction(campoBusca+" <= ?",textoBusca,StringType.INSTANCE));
break;
case 6:
crt.add(Restrictions.sqlRestriction(campoBusca+" like ?","%"+textoBusca+"%",StringType.INSTANCE));
break;
case 7:
crt.add(Restrictions.sqlRestriction(campoBusca+" like ?","%"+textoBusca,StringType.INSTANCE));
break;
default:
crt.add(Restrictions.sqlRestriction(campoBusca+" like ?","%"+textoBusca+"%",StringType.INSTANCE));
break;
}
}else{
if(!todosCampos.isEmpty()){
arrayAllFields = todosCampos.split(",");
String camposProcess = "";
String condicao = " like ";
Object[] values = new Object[arrayAllFields.length];
org.hibernate.type.Type[] types = new org.hibernate.type.Type[arrayAllFields.length];
switch (tipoBusca) {
case 0:
condicao = " = ";
break;
case 1:
condicao = " <> ";
break;
case 2:
condicao = " < ";
break;
case 3:
condicao = " > ";
break;
case 4:
condicao = " >= ";
break;
case 5:
condicao = " <= ";
break;
case 6:
condicao = " like ";
textoBusca = "%"+textoBusca+"%";
break;
case 7:
condicao = " like ";
textoBusca = "%"+textoBusca;
break;
default:
condicao = " like ";
textoBusca = "%"+textoBusca+"%";
break;
}
for (int j = 0; j < arrayAllFields.length; j++) {
camposProcess += "(" +arrayAllFields[j]+condicao+" ? )or";
values[j] = textoBusca;
types[j] = StringType.INSTANCE;
}
camposProcess = camposProcess.substring(0,camposProcess.length()-2);
crt.add(Restrictions.sqlRestriction("("+camposProcess+")", values, types));
}
}
}
if (exclusaoVirtual != null){
crt.add(Restrictions.eq("excluido", exclusaoVirtual));
}
return crt.list();
}
Ele funciona perfeitamente para campos sem cascateamentos de propriedades, mas como o meu possue @ManyToOne eu queria buscar por exemplo da tabela advogados todos os advogados que são do Rio de Janeiro, ou então quem é do Mato Grosso, seria fácil se fosse um campo String, mas ele é do tipo Estado, sendo assim teria que buscar
estado.descricao e não estado.
Obrigado.