(Resolvido) SqlRestrictions ALIAS em busca padrão [HIBERNATE]

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.

no JPA faço assim:

[code]
Root root = // código para meu root…
Path path = root.get(“estado”);
Path path2 = path.get(“nome”);

getEntityManager().getCriteriaBuilder().like(path2, “%minhapesquisa%”);[/code]

Pois é mas essa pesquisa seria com hibernate, rsr, mas obrigado pela resposta

é, rsrs, não uso Hibernate, uso EclipseLink. Mas se não me engano, o Hibernate 3 implementa também os métodos do JPA2 não?

Bom pessoal depois de umas pesquisas não encontrei uma forma de fazer via sqlRestrictions, me sugeriram fazer via hql mas como falei essa busca tem que ser dinamica para toda e qualquer classe, (do meu sistema é claro)

Utilizei disjunctions e create alias para me retomar o resultado…

Segue em anexo a função.

[code]public List listaTudo(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")){
			Integer tmpFieldIndex = campoBusca.indexOf(".");
			Boolean searchProperty = (tmpFieldIndex >= 0);
			
			if (searchProperty){
				String AliasCampo = campoBusca.substring(0,campoBusca.indexOf("."));
				crt.createAlias(AliasCampo,AliasCampo);
			}
			switch (tipoBusca) {
				case 0:			
					crt.add(Restrictions.eq(campoBusca, textoBusca));
					break;
				case 1:
					crt.add(Restrictions.not(Restrictions.eq(campoBusca, textoBusca)));
					break;
				case 2:
					crt.add(Restrictions.lt(campoBusca, textoBusca));
					break;
				case 3:
					crt.add(Restrictions.gt(campoBusca, textoBusca));
					break;
				case 4:
					crt.add(Restrictions.ge(campoBusca, textoBusca));
					break;
				case 5:
					crt.add(Restrictions.le(campoBusca, textoBusca));
					
					break;
				case 6:
					crt.add(Restrictions.ilike(campoBusca, "%"+textoBusca+"%"));
					break;
				case 7:
					crt.add(Restrictions.ilike(campoBusca, textoBusca+"%"));
					break;
				default:
					crt.add(Restrictions.ilike(campoBusca, "%"+textoBusca+"%"));
					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];
				Disjunction disjunctionOr = Restrictions.disjunction();  
				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++) {
					String tmpField = arrayAllFields[j];
					Integer tmpFieldIndex = arrayAllFields[j].indexOf(".");
					if (tmpFieldIndex == -1){
						camposProcess += "({alias}." +tmpField+condicao+" ? )or";
						values[j] = textoBusca;
						types[j] = StringType.INSTANCE;
					}else{
						String AliasCampo = tmpField.substring(0,tmpField.indexOf("."));
						crt.createAlias(AliasCampo,AliasCampo);  
						disjunctionOr.add(Restrictions.ilike(arrayAllFields[j], "%"+textoBusca+"%")); 
						camposProcess += "({alias}." +"id"+condicao+" ? )or";
						values[j] = textoBusca;
						types[j] = StringType.INSTANCE;
					}
					
				}
				camposProcess = camposProcess.substring(0,camposProcess.length()-2);
				crt.add(Restrictions.or(Restrictions.sqlRestriction("("+camposProcess+")", values, types), disjunctionOr));	
			}
			
		}
		
	}
	
	if (exclusaoVirtual != null){
		crt.add(Restrictions.eq("excluido", exclusaoVirtual));	
	}
	return crt.list();
}[/code]