Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Join com Criteria

Galera boa tarde,

Como eu posso modificar o método filtrados para que ele também retorne os grupos dos usuários? Algo como (JPQL)

"from Usuario u join fetch u.grupos".

    public List<Usuario> filtrados(UsuarioFilter filter) {        
        CriteriaBuilder builder = manager.getCriteriaBuilder();
        CriteriaQuery<Usuario> query = builder.createQuery(Usuario.class);
        Root<Usuario> usuarioRoot = query.from(Usuario.class);

        Predicate predicate = builder.and();

        if (filter.getId() != null)
            predicate = builder.and(predicate, builder.equal(usuarioRoot.<Long>get("id"), filter.getId()));

        if (!filter.getNome().isEmpty())
            predicate = builder.and(predicate, builder.like(usuarioRoot.<String>get("nome"), "%" + filter.getNome() + "%"));

        TypedQuery<Usuario> typedQuery = manager.createQuery(
                query.select(usuarioRoot).where(predicate)
            );

        return typedQuery.getResultList();
    }
@Entity
@Table(name = "usuario")
public class Usuario implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;
    private String nome;
    private String email;
    private String senha;
    private String telefone;
    private List<Grupo> grupos = new ArrayList<>();

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @NotBlank
    @Column(nullable = false, length = 80)
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    @NotBlank
    @Column(nullable = false, unique = false, length = 50)
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Column(nullable = false, length = 60)
    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    @NotBlank
    @Column(nullable = false, length = 50)
    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    @NotNull
    @ManyToMany
    @JoinTable(name = "usuario_grupo", 
                joinColumns = @JoinColumn(name = "usuario_id"), 
                inverseJoinColumns = @JoinColumn(name = "grupo_id"))
    public List<Grupo> getGrupos() {
        return grupos;
    }

    public void setGrupos(List<Grupo> grupos) {
        this.grupos = grupos;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Usuario other = (Usuario) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }
@Entity
@Table(name = "grupo")
public class Grupo implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;
    private String nome;
    private String descricao;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Column(nullable = false, length = 30)
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    @Column(nullable = false, length = 80)
    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Grupo other = (Grupo) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }

}
1 resposta
solução!
    public List<Usuario> filtrados(UsuarioFilter filter) {        
        CriteriaBuilder builder = manager.getCriteriaBuilder();
        CriteriaQuery<Usuario> query = builder.createQuery(Usuario.class);
        Root<Usuario> usuarioRoot = query.from(Usuario.class);

        Predicate predicate = builder.and();

        if (filter.getId() != null)
            predicate = builder.and(predicate, builder.equal(usuarioRoot.<Long>get("id"), filter.getId()));

        if (!filter.getNome().isEmpty())
            predicate = builder.and(predicate, builder.like(usuarioRoot.<String>get("nome"), "%" + filter.getNome() + "%"));

    //Adicionado join
    usuarioRoot.join("grupos");

        TypedQuery<Usuario> typedQuery = manager.createQuery(
        //Adicionado .distinct(true)
                query.select(usuarioRoot).where(predicate).distinct(true) 
            );

        return typedQuery.getResultList();
    }