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;
}