package br.com.ecodetech.alunoweb.model.dao; import java.io.Serializable; import java.lang.reflect.ParameterizedType; import java.util.List; import javax.inject.Inject; import javax.persistence.EntityManager; import javax.persistence.Query; import br.com.ecodetech.alunoweb.model.bean.AbstractEntityBean; import br.com.ecodetech.alunoweb.model.enums.TipoOrdemEnum; @SuppressWarnings({ "unchecked", "serial" }) public class GenericDAO<T extends AbstractEntityBean> implements Serializable { @Inject private EntityManager em; private Class<T> classe; public GenericDAO() { this.classe = getClassType(); } private Class<T> getClassType() { /* * System.out.println("getClass(): " + getClass()); * System.out.println("getClass().getGenericSuperclass(): " + * getClass().getGenericSuperclass()); * System.out.println("getClass().getSuperclass(): " + * getClass().getSuperclass()); System.out * .println("getClass().getSuperclass().getGenericSuperclass(): " + * getClass().getSuperclass().getGenericSuperclass()); */ // Class<?> superClass = getClass().getSuperclass(); // ParameterizedType parameterizedType = (ParameterizedType) // superClass.getGenericSuperclass(); ParameterizedType parameterizedType = (ParameterizedType) getClass() .getGenericSuperclass(); return (Class<T>) parameterizedType.getActualTypeArguments()[0]; } public void cadastrar(T t) { em.persist(t); } public void alterar(T t) { em.merge(t); } public void excluir(T t) { em.remove(em.merge(t)); } public T consultar(Long id) { return (T) em.getReference(classe, id); } public List<T> listar() { return em.createQuery(("From " + classe.getName())).getResultList(); } public void excluirTodos(){ for(T t: listar()){ excluir(t); } } /** * Metodo que retorna uma lista paginada * * @param inicio * - primeiro elemento da lista * @param maxPorPagina * - total de registros da lista * @param campoOrdenar * - campo base da ordenacao * @param tipoOrdem * - crescente (ASC) ou decrescente (DESC) * @param filtros * - criterios para filtro de registros * @return lista paginada */ public List<T> listar(int inicio, int maxPorPagina, String campoOrdenar, TipoOrdemEnum tipoOrdem, String campoFiltro, String valorFiltro) { String sql = "select c from " + classe.getName() + " c "; if (campoOrdenar == null || campoOrdenar.equals("")) { campoOrdenar = campoFiltro; } sql += " where UPPER(c." + campoFiltro + ") like UPPER(:" + campoFiltro + ")" + " order by c." + campoOrdenar + " " + tipoOrdem.getNome(); Query query = em.createQuery(sql); query.setParameter(campoFiltro, valorFiltro); query.setFirstResult(inicio); query.setMaxResults(maxPorPagina); return query.getResultList(); } public EntityManager getEm() { return em; } public Long getTotalRegistros(String campoFiltro, String valorFiltro) { String sql = "select COUNT(c) from " + classe.getName() + " c "; sql += " where UPPER(c." + campoFiltro + ") like UPPER(:" + campoFiltro + ")"; Query query = em.createQuery(sql); query.setParameter(campoFiltro, valorFiltro); Number result = (Number) query.getSingleResult(); return result.longValue(); } }