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}">
?– Victor Stafusa
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?
– Bruno Nicoletti
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.
– Bruno Nicoletti