Criteria Bringing Duplicate Hibernate Data to JSF

Asked

Viewed 286 times

2

I am receiving duplicate data or sometimes missing data until, how can I solve?

This is my DAO:

 public List<Produto> filtrados(Filtro filtro) {
    try {
        Criteria criteria = criarCriteriaParaFiltro(filtro);

        criteria.setFirstResult(filtro.getPrimeiroRegistro());
        criteria.setMaxResults(filtro.getQuantidadeRegistros());
        return criteria.list();
    } catch (Exception ex) {
        System.out.println("Erro: " + ex.getMessage());
        return null;
    } finally {
        HibernateUtil.closeSession();
    }
}

public int quantidadeFiltrados(Filtro filtro) {
    try {
        Criteria criteria = criarCriteriaParaFiltro(filtro);

        criteria.setProjection(Projections.rowCount());

        return ((Number) criteria.uniqueResult()).intValue();
    } catch (Exception ex) {
        System.out.println("Erro: " + ex.getMessage());
        return 0;
    }
}

private Criteria criarCriteriaParaFiltro(Filtro filtro) {
    try {
        sessao = HibernateUtil.getSession();
        Criteria criteria = sessao.createCriteria(Produto.class);

        criteria.add(Restrictions.eq("empresaProduto", util.Util.retornaEmpresa()));
        criteria.add(Restrictions.eq("statusProduto", "Ativo"));
        if (filtro.getCategoriaProduto() != null) {
            criteria.add(Restrictions.eq("categoriaProduto", filtro.getCategoriaProduto()));
        }

        criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        return criteria;
    } catch (Exception ex) {
        System.out.println("Erro: " + ex.getMessage());
        return null;
    }
}

Here my Bean Listing:

@ManagedBean
@ViewScoped
public class ListaProdutoBean implements Serializable {  

    private static final long serialVersionUID = 1L; 

    private Filtro filtro = new Filtro();
    private LazyDataModel<Produto> model;
    private final ProdutoDAO prodDAO = new ProdutoDAO();


    public Filtro getFiltro() {
        return filtro;
    }


    public void setFiltro(Filtro filtro) {
        this.filtro = filtro;
    }

    public LazyDataModel<Produto> getModel() {
        return model;
    }


    public void setModel(LazyDataModel<Produto> model) {
        this.model = model;        
    }


    public ListaProdutoBean() {
        model = new LazyDataModel<Produto>() {

            @Override
            public List<Produto> load(int first, int pageSize,
                    String sortField, SortOrder sortOrder,
                    Map<String, Object> filters) {

                filtro.setPrimeiroRegistro(first);
                filtro.setQuantidadeRegistros(12);
                filtro.setAscendente(SortOrder.ASCENDING.equals(sortOrder));
                filtro.setPropriedadeOrdenacao("nomeProduto");

                setRowCount(prodDAO.quantidadeFiltrados(filtro));
                RequestContext.getCurrentInstance().execute("estilo();");
                return prodDAO.filtrados(filtro);

            }

        };
    }

}

And here’s my JSF page:

<p:dataGrid 
                    class="pagination" id="listaProdutos" layout="grid" value="#{listaProdutoBean.model}" columns="3" paginator="true" lazy="true" rows="4" var="produto" emptyMessage="Nenhum produto encontrado">
                    <div class="row">
                        <h5 class="center-align">#{produto.nomeProduto}</h5>                        
                    </div>
                    <div class="row center-align">
                        <p:graphicImage height="130" width="130" value="../imagens/#{produto.imagemProduto}"/>
                        <br></br>
                        <br></br>
                        <mp:button value="MonteJá" update="formBebida:nome, formBebida:descricao, formBebida:valor,formBebida:imagem,formProduto:nome, formProduto:precoTamanho, formProduto:adicionais, formProduto:descricao, formProduto:valor, formProduto:ingrediente,formProduto:imagem" action="#{vendaBean.carregar(produto.idProduto)}"></mp:button>
                    </div>

                </p:dataGrid>

As you can see, I manually set the amount of records per page on the bean to force it to bring more, and at this point it returns duplicate data. But when I set the pattern to recognize per page, it returns only 2 records on the screen.

  • This #{produto.nomeProduto} loose on your page seems to me to be a possible vector for a XSS. Wouldn’t it be better to put it as <h:outputText value="#{produto.nomeProduto}">?

  • Really, it had gone through me this gap, but I already solved, now the problem is in this pagination, will q may have to do with loading the Lazy type?

  • In some tests here I find that the same jsf is the bug because when I increase the number of Rows it displays all. When I put a number less than 4 it displays a 4 page page page page and two records per page but duplicated.

1 answer

0


Browser other questions tagged

You are not signed in. Login or sign up in order to post.