GenericFacade.java 1.6 KB
package fi.insomnia.bortal.facade;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

import fi.insomnia.bortal.model.ModelInterface;


/**
 * Session Bean implementation class GenericFacade
 */
@Stateless
public class GenericFacade<T extends ModelInterface> implements GenericFacadeLocal<T> {

	@PersistenceContext
	private EntityManager em;
	
	private Class<T> clazz;

	/**
	 * Default constructor.
	 */
	public GenericFacade(Class<T> entityType) {
		clazz = entityType;
	}

	public void create(T entity) {
		em.persist(entity);
	}

	public void remove(T entity) {
		em.remove(entity);
	}

	public T merge(T entity) {
		return em.merge(entity);
	}

	public T find(Object id) {
		return em.find(clazz, id);
	}

	public List<T> findAll() {
		CriteriaQuery<T> cq = em.getCriteriaBuilder().createQuery(clazz);
		cq.select(cq.from(clazz));
		return em.createQuery(cq).getResultList();
	}

	public List<T> findRange(int[] range) {
		CriteriaQuery<T> cq = em.getCriteriaBuilder().createQuery(clazz);
		cq.select(cq.from(clazz));
		TypedQuery<T> q = em.createQuery(cq);
		q.setMaxResults(range[1] - range[0]);
		q.setFirstResult(range[0]);
		return q.getResultList();
	}

	public long count() {
		CriteriaQuery<Long> cq = em.getCriteriaBuilder().createQuery(Long.class);
		Root<T> rt = cq.from(clazz);
		cq.select(em.getCriteriaBuilder().count(rt));
		TypedQuery<Long> q = em.createQuery(cq);
		return q.getSingleResult();
	}

}