Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Criteria API

Criei um método genérico que recebe uma lista de parametros e faz a busca no banco de dados para devolver uma lista de objetos que contenham aqueles parametros. Estou fazendo isso usando criteria, mas quando o hibernate faz a query no meu console aparece que ele ta fazendo where like... AND like... AND like...

O que eu gostaria é que ele fizesse a query só que no lugar do AND fosse OR, mas não estou conseguindo. Gostaria de uma ajuda, vou deixar o código do método abaixo. Obrigado.

     public List<T> findByParameter(List<String> elements) {
        Class<?> generic = this.clazz;
        CriteriaBuilder criteriaBuilder = this.manager.getCriteriaBuilder();
        CriteriaQuery<T> query = criteriaBuilder.createQuery(this.clazz);
        Root<T> root = query.from(this.clazz);
        List<Predicate> predicates = new ArrayList<Predicate>();
        for (String element : elements) {
            while (generic != null) {
                for (Field field : generic.getDeclaredFields()) {
                    field.setAccessible(true);
                    if (field.getType() == String.class) {
                        predicates.add(criteriaBuilder.like(root.get(field.getName()), "%" + element + "%"));
                    }
                }
                generic = generic.getSuperclass();

            }
        }
        query.where((Predicate[]) predicates.toArray(new Predicate[0]));
        List<T> resultList = this.manager.createQuery(query).getResultList();
        resultList.stream().forEach(System.out::println);
        return resultList;
    }
2 respostas
solução!

Opa, você precisa usar o CriteriaBuilder e invocar o método disjunction(). Ele cria predicados que vão virar OR.

Entendi, tentei aqui, mas não consegui combinar o disjunction com o like. Não deveria funcionar mais ou menos assim: criateriaBuilder.disjunction().like(...)?