2
respostas

Specification - busca com join em multiplas tabelas

Digamos que eu tenha as seguintes entidades a seguir:

@Entity
public class Pessoa {

    ...
    private Endereco endereco;
    ...
}

@Entity
public class Endereco {

    ...
    private Logradouro logradouro;
    ...
}


@Entity
public class Logradouro {

    ...
    private String rua;
    private String cep;
    ...
}

estou criando minhas Specifications como as da aula. Exemplo

    public static Specification<PessoaModel> logradouro(Integer logradouroId) {

        if (logradouroId != null) {
            return ((root, criteriaQuery, criteriaBuilder) ->
                    criteriaBuilder.equal(root.get("pessoa").get("endereco").get("logradouroId")., logradouroId));
        } else {
            return null;
        }
    }

Como faço pra criar uma specification pra uma busca (findAll()) por Pessoa pelo id do Logradouro?

Em SQL seria mais ou menos isso:

SELECT p.* FROM Pessoa p
JOIN  Endereco e on p.pessoa_id = e.pessoa_id
JOIN Logradouro l on e.logradouro_id = l.logradouro_id
where l.logradouro_id = 10;
2 respostas

Também gostaria de saber

Ficaria mais ou menos assim, não testei e talvez precise de algum ajuste mas acho que dá pra entender rs

    public static Specification<Pessoa> filterByLogradouro(int idlogradouro) {
        return (root, query, criteriaBuilder) -> {
            List<Predicate> list = new ArrayList<Predicate>();
            Join<Pessoa, Endereco> endereco = root.join("endereco", JoinType.INNER);
            Join<Endereco, Logradouro> logradouro = endereco.join("logradouro", JoinType.INNER);

            list.add(criteriaBuilder.equal(logradouro.get("id"), idlogradouro));

            Predicate[] p = new Predicate[list.size()];
            return criteriaBuilder.and(list.toArray(p));
    }