package com.commafeed.backend.dao; import java.util.Arrays; import java.util.Collection; import java.util.List; import javax.annotation.PostConstruct; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import javax.persistence.metamodel.Attribute; import com.commafeed.backend.model.AbstractModel; import com.google.common.reflect.TypeToken; import com.uaihebert.factory.EasyCriteriaFactory; import com.uaihebert.model.EasyCriteria; @SuppressWarnings("serial") public abstract class GenericDAO { private TypeToken type = new TypeToken(getClass()) { }; @PersistenceContext protected EntityManager em; protected CriteriaBuilder builder; @PostConstruct public void init() { builder = em.getCriteriaBuilder(); } public void saveOrUpdate(Collection models) { int i = 0; for (AbstractModel model : models) { if (model.getId() == null) { em.persist(model); } else { em.merge(model); } if (i % 20 == 0) { em.flush(); } i++; } } public void saveOrUpdate(AbstractModel... models) { saveOrUpdate(Arrays.asList(models)); } public void delete(T object) { if (object != null) { object = em.merge(object); em.remove(object); } } public void delete(List objects) { for (T object : objects) { delete(object); } } public void deleteById(Long id) { Object ref = em.getReference(getType(), id); if (ref != null) { em.remove(ref); } } public T findById(Long 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 List findAll(int startIndex, int count, String orderBy, boolean asc) { EasyCriteria criteria = EasyCriteriaFactory.createQueryCriteria(em, getType()); criteria.setMaxResults(count); criteria.setFirstResult(startIndex); if (asc) { criteria.orderByAsc(orderBy); } else { criteria.orderByDesc(orderBy); } 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(Attribute field, V value) { EasyCriteria criteria = createCriteria(); criteria.andEquals(field.getName(), value); return criteria.getResultList(); } protected void limit(TypedQuery query, int offset, int limit) { if (offset > -1) { query.setFirstResult(offset); } if (limit > -1) { query.setMaxResults(limit); } } @SuppressWarnings("unchecked") protected Class getType() { return (Class) type.getRawType(); } public EasyCriteria createCriteria() { return EasyCriteriaFactory.createQueryCriteria(em, getType()); } }