6
respostas

Dificuldade no filtro

Olá a todos, tudo certo?
Estou com dificuldades em aplicar o filtro de gênero na minha tabela de livros.
Quando escolho o gênero, ele não acha os livros com o gênero.
Na view, não estou usando o LivroDataModel, e sim a lista de livros fornecida pelo LivroBean.
Será que alguèm poderia me ajudar?
Vou postar minha View, e meu bean e minha classe livro.
6 respostas
Segue minha tabela na view:
```

                Livros
                
                    
                
                
                    
                
                
                    
                        
                    
                
                
                    
                        
                    
                
                
                    
                        
                            
                            
                        
                    
                    
                

                
                    
                

                
                    
                
            

```


segue meu LivroBean:
```
package br.com.caelum.livraria.bean;

import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;

import br.com.caelum.livraria.dao.DAO;
import br.com.caelum.livraria.modelo.Autor;
import br.com.caelum.livraria.modelo.Livro;
import br.com.caelum.livraria.modelo.LivroDataModel;

@ManagedBean
@ViewScoped
public class LivroBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private Livro livro = new Livro();

    private Integer autorId;

    private List livros;
    private LivroDataModel livroDataModel = new LivroDataModel();
    private  List generos = Arrays.asList("Romance", "drama", "ação");

    public void setAutorId(Integer autorId) {
        this.autorId = autorId;
    }

    public Integer getAutorId() {
        return autorId;
    }

    public Livro getLivro() {
        return livro;
    }

    public void setLivro(Livro livro) {
        this.livro = livro;
    }

    public List getLivros() {
        DAO dao = new DAO(Livro.class);
        if (this.livros == null) {
            this.livros = dao.listaTodos();
        }
        return livros;
    }

    public LivroDataModel getLivroDataModel() {
        return livroDataModel;
    }

    public List getGeneros() {
        return generos;
    }

    public void setGenero(String genero) {
        this.genero = genero;
    }

    public List getAutores() {
        return new DAO(Autor.class).listaTodos();
    }

    public List getAutoresDoLivro() {
        return this.livro.getAutores();
    }

    public void carregarLivroPelaId() {
        this.livro = new DAO(Livro.class).buscaPorId(this.livro.getId());
    }

    public void gravarAutor() {
        Autor autor = new DAO(Autor.class).buscaPorId(this.autorId);
        this.livro.adicionaAutor(autor);
        System.out.println("Escrito por: " + autor.getNome());
    }

    public void gravar() {
        System.out.println("Gravando livro " + this.livro.getTitulo());
        DAO dao = new DAO(Livro.class);

        if (livro.getAutores().isEmpty()) {
            FacesContext.getCurrentInstance().addMessage("autor",
                    new FacesMessage("Livro deve ter pelo menos um Autor."));
            return;
        }

        if (this.livro.getId() == null) {
            dao.adiciona(this.livro);
            this.livros = dao.listaTodos();
        } else {
            dao.atualiza(this.livro);
        }

        this.livro = new Livro();
    }

    public void remover(Livro livro) {
        System.out.println("Removendo livro");
        DAO dao = new DAO(Livro.class);
        dao.remove(livro);
        this.livro = new Livro();
        this.livros = dao.listaTodos();
    }

    public void removerAutorDoLivro(Autor autor) {
        this.livro.removeAutor(autor);
    }

    public void carregar(Livro livro) {
        System.out.println("Carregando livro");
        this.livro = livro;
    }

    public String formAutor() {
        System.out.println("Chamanda do formulário do Autor.");
        return "autor?faces-redirect=true";
    }

    public void comecaComDigitoUm(FacesContext fc, UIComponent component, Object value) throws ValidatorException {

        String valor = value.toString();
        if (!valor.startsWith("1")) {
            throw new ValidatorException(new FacesMessage("ISBN deveria começar com 1"));
        }

    }

    public boolean precoEhMenor(Object valorDaColuna, Object filtroDigitado, Locale locale) {
//        Retirando os espaços do texto digitado no filtro
        String textoDigitado = (filtroDigitado == null) ? null : filtroDigitado.toString().trim();
//Retorna verdadeiro se nada for digitado no filtro
        if (textoDigitado == null) {
            return true;
        }
//Retorna falso se o valor da coluna for nulo
        if (valorDaColuna == null) {
            return false;
        }
        try {
            Double precoColuna = (Double) valorDaColuna;
            Double precoDigitado = Double.valueOf(textoDigitado);
            return precoColuna.compareTo(precoDigitado) < 0;
        } catch (NumberFormatException e) {
            // O usuário não digitou um número
            return false;
        }
    }

}

```


Minha classe Livro
```
package br.com.caelum.livraria.modelo;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
public class Livro implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    private Integer id;

    private String titulo;
    private String isbn;
    private String genero;
    private double preco;
    @Temporal(TemporalType.DATE)
    private Calendar dataLancamento = Calendar.getInstance();

    @ManyToMany(fetch = FetchType.EAGER)
    private List autores = new ArrayList();

    public List getAutores() {
        return autores;
    }

    public void adicionaAutor(Autor autor) {
        this.autores.add(autor);
    }

    public Livro() {
    }

    public Integer getId() {
        return id;
    }

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

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public String getIsbn() {
        return isbn;
    }

    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }

    public String getGenero() {
        return genero;
    }

    public void setGenero(String genero) {
        this.genero = genero;
    }

    public double getPreco() {
        return preco;
    }

    public void setPreco(double preco) {
        this.preco = preco;
    }

    public Calendar getDataLancamento() {
        return dataLancamento;
    }

    public void setDataLancamento(Calendar dataLancamento) {
        this.dataLancamento = dataLancamento;
    }

    public void removeAutor(Autor autor) {
        this.autores.remove(autor);
    }

}
```

Abraços e aguardo retorno.
Faltou a view de livros:

<p:dataTable value="#{livroBean.livros}" var="livro" id="tabelaLivros" paginator="true" rows="2" widgetVar="tabelaLivros"> <f:facet name="header">Livros <p:column headerText="título" sortBy="#{livro.titulo}" filterBy="#{livro.titulo}" filterMatchMode="startsWith"> <h:outputText value="#{livro.titulo}" /> <p:column headerText="ISBN" sortBy="#{livro.isbn}" filterBy="#{livro.isbn}" filterMatchMode="contains"> <h:outputText value="#{livro.isbn}" /> <p:column headerText="preço" sortBy="#{livro.preco}" filterBy="#{livro.preco}" filterFunction="#{livroBean.precoEhMenor}"> <h:outputText value="#{livro.preco}"> <f:convertNumber type="currency" pattern="R$ #0.00" currencySymbol="R$" locale="pt_BR" /> <p:column headerText="Data de lançamento" sortBy="#{livro.dataLancamento.time}" filterBy="#{livro.dataLancamento.time}" filterMatchMode="contains"> <h:outputText value="#{livro.dataLancamento.time}"> <f:convertDateTime pattern="dd/MM/yyyy" timeZone="America/Sao_Paulo" /> <p:column headerText="gênero" sortBy="#{livro.genero}" filterBy="#{livro.genero}" filterMatchMode="startsWith"> <f:facet name="filter"> <p:selectOneMenu onchange="PF('tabelaLivros').filter()"> <f:selectItem itemLabel="selecione" itemValue="#{null}" noSelectionOption="true" /> <f:selectItems value="#{livroBean.generos}" /> <h:outputText value="#{livro.genero}" />

            <p:column headerText="alterar">
                <p:commandLink value="altera" action="#{livroBean.carregar(livro)}"
                    update=":formRegistroLivro" />
            </p:column>

            <p:column headerText="remover">
                <p:commandLink value="remove" action="#{livroBean.remover(livro)}"
                    update="tabelaLivros" />
            </p:column>
        </p:dataTable>

Guido,

Consegue subir o projeto no github? Fica mais fácil de analisar

Oi Hotávio, tudo bem? Peço minhas sinceras desculpas pela demora. Já postei o projeto no github, como havia me pedido. Segue link do repositório:
https://github.com/guido-warken/livraria

Abraços!