package com.commafeed.backend.dao; import java.io.Serializable; import java.util.List; import javax.annotation.PostConstruct; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import com.google.common.reflect.TypeToken; import com.uaihebert.factory.EasyCriteriaFactory; import com.uaihebert.model.EasyCriteria; @SuppressWarnings("serial") public abstract class GenericDAO implements Serializable { private TypeToken type = new TypeToken(getClass()) { }; @PersistenceContext protected EntityManager em; protected CriteriaBuilder builder; @PostConstruct public void init() { builder = em.getCriteriaBuilder(); } public void save(T object) { em.persist(object); } public void update(T... objects) { for (Object object : objects) { em.merge(object); } } public void delete(T object) { object = em.merge(object); em.remove(object); } public void deleteById(Object id) { Object ref = em.getReference(getType(), id); em.remove(ref); } public T findById(K id) { T t = em.find(getType(), id); return t; } public List findAll() { return EasyCriteriaFactory.createQueryCriteria(em, getType()) .getResultList(); } public List findAll(int startIndex, int count) { EasyCriteria criteria = EasyCriteriaFactory.createQueryCriteria(em, getType()); criteria.setMaxResults(count); criteria.setFirstResult(startIndex); return criteria.getResultList(); } public long getCount() { CriteriaBuilder builder = em.getCriteriaBuilder(); CriteriaQuery query = builder.createQuery(Long.class); Root root = query.from(getType()); query.select(builder.count(root)); return em.createQuery(query).getSingleResult(); } public List findByField(String field, Object value) { EasyCriteria criteria = EasyCriteriaFactory.createQueryCriteria(em, getType()); criteria.andEquals(field, value); return criteria.getResultList(); } @SuppressWarnings("unchecked") protected Class getType() { return (Class) type.getRawType(); } }