Consulta HQL que busque tanto palavras acentuadas e não acentuadas?

2 respostas
L

Olá,

Preciso fazer uma consulta em HQL que busque tanto palavras acentuadas e não acentuadas?

Até o momento eu consigo através do método normalize tirar a acentuação e buscar tudo que não não possui acentuação, também coloquei o método replacer para considerar a acentuação.

@Override

public List findAuctionParameter(String value, Integer offset, Integer size) {

Map<String, Object> parameters = new HashMap<String, Object>();
String valueNormalize = Util.normalize(value);     
	String valueReplacer = Util.replacer(value);
	
	final String SELECT_ALL_PARAMETER = "select a "
			+ "from AuctionParameter a "
			+ "inner join a.city city " 
			+ "inner join a.serviceArea serviceArea "
			+ "inner join a.product product "
			+ "inner join a.osType osType "; 

	
	StringBuilder hql = new StringBuilder();
	
	hql.append(SELECT_ALL_PARAMETER);
	if (!Util.isEmpty(value) && !"null".equalsIgnoreCase(value)) {
		hql.append(" where upper(city.name) like upper(:search)");
		hql.append(" OR upper(city.name) like upper(:searchNoNormalize) ");
		hql.append(" OR upper(product.name) like upper(:search)");
		hql.append(" OR upper(product.name) like upper(:searchNoNormalize)");
		hql.append(" OR upper(serviceArea.description) like upper(:search)");
		hql.append(" OR upper(serviceArea.description) like upper(:searchNoNormalize)");
		hql.append(" OR upper(osType.description) like upper(:search)");
		hql.append(" OR upper(osType.description) like upper(:searchNoNormalize)");


	}
	
	TypedQuery<AuctionParameter> query = entityManager.createQuery(hql.toString(), AuctionParameter.class);

	for (String key : parameters.keySet()) {
		query.setParameter(key, parameters.get(key));
	}

	if (!Util.isEmpty(value) && !"null".equalsIgnoreCase(value)) {
		   query.setParameter("search", "%"+valueNormalize.toUpperCase()+"%");
		   query.setParameter("searchNoNormalize", "%"+valueReplacer.toUpperCase()+"%");
		  }

	query.setFirstResult(offset - 1);
	query.setMaxResults(size);
	return query.getResultList();
}

Util.java

public static String normalize(String entry) {

if (isEmpty(entry))

return entry;

entry = Normalizer.normalize(entry, Normalizer.Form.NFD);

return entry.replaceAll("[^\p{ASCII}]", “”);

}
public static String replacer(String param) {
    String t1 = "áàâäçéèëêùûüôöïî";
    String t2 = "aaaaceeeeuuuooii";
    String s = param;
    for (int i = 0; i < t1.length(); i++) {
        s = "replace(" + s + ",'" + t1.charAt(i) + "','" + t2.charAt(i) + "')";
    }
    return s;
}

2 Respostas

L

ja tentou usar um “coringa” na consulta?
Por exemplo:

“SELECT * FROM table WHERE campo LIKE ‘%BUSCA%’”

no caso o coringa seria o ‘%’

L

Sim, estou utilizando

if (!Util.isEmpty(value) && !null”.equalsIgnoreCase(value)) {

query.setParameter(search”, %+valueNormalize.toUpperCase()+"%");

query.setParameter(searchNoNormalize”, %+valueReplacer.toUpperCase()+"%");

}
Criado 8 de maio de 2018
Ultima resposta 8 de mai. de 2018
Respostas 2
Participantes 2