Olá pessoal, estou tentando fazer a pagina na minha dataTable com a propriedde lazy do primefaces, mas o problema é que os registros nao aparecem na table. O que fazer?
Estou iniciando um projeto e já de cara topei com uma tabela que tem + de 60.000 registros, bom pra encurtar a história eu vi seu código e usei aqui, cheguei no mesmo ponto que você.
Se você já resolveu me desculpe mas eu tive progressos aqui:
public LazyDataModel<Empresa> getEmpresas() {
if (empresas == null) {
empresas = new LazyDataModel<Empresa>() {
@Override
public List<Empresa> load(int first, int pageSize,
String string, boolean bln, Map<String, String> map) {
Dao<Empresa> dao = new Dao<Empresa>(Empresa.class);
List<Empresa> pesquisaEmpresa = dao.getListaPaginado(first,
pageSize);
return pesquisaEmpresa;
}
};
Dao<Empresa> dao = new Dao<Empresa>(Empresa.class);
int totalRowCount = dao.count(); //Veja este código que você teria que acrescentar no seu.
empresas.setPageSize(10);
empresas.setRowIndex(1);
empresas.setRowCount(totalRowCount);
}
return empresas;
}
DAO
@SuppressWarnings("unchecked")
public List<T> getListaPaginado(int inicio, int quantidade) {
EntityManager em = PersistenceUtil.getEntityManager();
Query query = em
.createQuery("SELECT e FROM " + classe.getName() + " e").setFirstResult(inicio).setMaxResults(quantidade);
List<T> lista = query.getResultList();
PersistenceUtil.close(em);
return lista;
}
Bom está funcionando mas não com os 60.000 registros que comentei, esta lento demais, estou em busca de uma maneira de melhorar isto, não sei onde está meu erro, vi sobre fetch = FetchType.LAZY, todas as minhas classes estão assim, mas até agora nenhuma melhora.
Não sei se o DAO ai postado está errado, enfim to na luta, rsrsr.
Se puder me ajudar também agradeço.
Me desculpa a demora, estava trabalhando em outro projeto, mas voltando ao nosso problena, não resolvi não. Seu código é bom, mas não consegui fazer funcionar aqui. Por favor, vc poderia me mostrar toda a sua classe do bean e do DAO e também todas as outras que tiverem relação com essa paginação, como a XHTML? Se nao quiser mostrar aqui me mande no meu email: clever-rossi@hotmail.com
Se quiser me add no msn, é o mesmo do email. É bom p/ trocarmos umas ideias.
Por favor me ajude…
Boa tarde, seguinte em primeiro lugar o que disse referente a lentidão, esquece, não tá não, eu que errei no deploy no servidor, rsrsrs, mas tá funcionando legal até o momento, se nada acontecer de diferente.
Não tem problema não em postar aqui, até porque caso alguém precise e pode ter algum erro que não sei, enfim mais pessoas podem ajudar a melhorar e trocar informações:
O XHMTL (não postarei tudo, pq não tem necessidade) o que mudou aqui é o lazy=“true”
Bean (somente a parte que interessa no assunto aqui para não ficar extenso demais ok)
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.management.Query;
import javax.persistence.EntityManager;
import modelo.Profissional;
import org.primefaces.model.LazyDataModel;
import dao.Dao;
import dao.PersistenceUtil;
import dao.ProfissionalDAO;
@ManagedBean(name = "profissionalMB")
@SessionScoped
public class ProfissionalMB implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private Profissional profissional;
private LazyDataModel<Profissional> profissionais;
public ProfissionalMB() {
super();
}
public LazyDataModel<Profissional> getProfissionais() {
if (profissionais == null) {
profissionais = new LazyDataModel<Profissional>() {
@Override
public List<Profissional> load(int first, int pageSize,
String string, boolean bln, Map<String, String> map) {
Dao<Profissional> dao = new Dao<Profissional>(
Profissional.class);
List<Profissional> pesquisaProfissional = dao
.getListaPaginado(first, pageSize);
return pesquisaProfissional;
}
};
Dao<Profissional> dao = new Dao<Profissional>(Profissional.class);
int totalRowCount = dao.count();
profissionais.setPageSize(10);
profissionais.setRowIndex(1);
profissionais.setRowCount(totalRowCount);
}
return profissionais;
}
public void setProfissionais(LazyDataModel<Profissional> profissionais) {
this.profissionais = profissionais;
}
DAO (genérico) resolvi postar este completo veja o metodo count no fim que uso para saber a quantidade de registros, que li em outros posts que era necessário para contagem de páginas;
package dao;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaQuery;
public class Dao<T> {
private final Class<T> classe;
public Dao(Class<T> classe) {
this.classe = classe;
}
public void adiciona(T t) {
EntityManager em = null;
try {
em = PersistenceUtil.getEntityManager();
em.getTransaction().begin();
em.persist(t);
em.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
em.getTransaction().rollback();
} finally {
PersistenceUtil.close(em);
}
}
public void remove(T t) {
EntityManager em = null;
try {
em = PersistenceUtil.getEntityManager();
em.getTransaction().begin();
em.remove(em.merge(t));
em.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
em.getTransaction().rollback();
} finally {
PersistenceUtil.close(em);
}
}
public void atualiza(T t) {
EntityManager em = PersistenceUtil.getEntityManager();
em.getTransaction().begin();
em.merge(t);
em.getTransaction().commit();
PersistenceUtil.close(em);
}
@SuppressWarnings("unchecked")
public List<T> getAll() {
EntityManager em = PersistenceUtil.getEntityManager();
CriteriaQuery<T> query = em.getCriteriaBuilder().createQuery(classe);
query.select(query.from(classe));
List<T> lista = em.createQuery(query).getResultList();
PersistenceUtil.close(em);
return lista;
}
@SuppressWarnings("unchecked")
public List<T> getListaPaginado(int inicio, int quantidade) {
EntityManager em = PersistenceUtil.getEntityManager();
Query query = em
.createQuery("SELECT e FROM " + classe.getName() + " e").setFirstResult(inicio).setMaxResults(quantidade);
List<T> lista = query.getResultList();
PersistenceUtil.close(em);
return lista;
}
public T buscaPorId(int id) {
EntityManager em = PersistenceUtil.getEntityManager();
return em.find(classe, id);
}
@SuppressWarnings("unchecked")
public int count() {
Long resultado = new Long(0L);
EntityManager em = PersistenceUtil.getEntityManager();
Query query = em.createQuery("select count(e) from " + classe.getName()
+ " e");
resultado = (Long) query.getSingleResult();
return resultado.intValue();
}
}
Bom espero que ajude e também estarei adicionando no msn ok, assim quanto mais amigos mais informações teremos né, rsrsrs, sou iniciante ok.
Se alguém achar algo errado, hardcode, enfim por favor agradeço para melhorar.
Bon dia César, tudo bom?
Olha só, a paginação funcionou perfeitamente se eu retirar a propriedade selectionMode=“true” da tabela, e se eu colocar a propriedade ai os botões de navegação da paginação nao funcionam. Já passou por algo assim?