package org.jboss.seam.rest.examples.tasks.resource; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import org.jboss.seam.rest.examples.tasks.entity.Category; import org.jboss.seam.rest.examples.tasks.entity.Task; /** * Loads collections of Tasks and Categories from database. * * @author <a href="http://community.jboss.org/people/jharting">Jozef Hartinger</a> */ @Stateless public class CollectionBean { @PersistenceContext private EntityManager em; @SuppressWarnings("unchecked") // we could do typesafe queries, but Resin (eclipselink) does not support that ATM public List<Category> getCategories(int start, int limit) { Query query = em.createNamedQuery("categories"); applyPaginationParameters(query, start, limit); return query.getResultList(); } @SuppressWarnings("unchecked") // we could do typesafe queries, but Resin (eclipselink) does not support that ATM public List<Task> getTasks(int start, int limit, String status, String categoryName) { Query query = null; if (categoryName == null) { query = em.createNamedQuery("tasks"); } else { query = em.createNamedQuery("tasksByCategory").setParameter("category", categoryName); } query = applyResolutionParameter(query, status); applyPaginationParameters(query, start, limit); return query.getResultList(); } /** * Modifies query passed as a parameter to filter out tasks based on their status (resolved/unresolved/all) */ protected Query applyResolutionParameter(Query query, String status) { if ("resolved".equals(status)) { // double assignment as a workaround for HHH-4541 return query.setParameter("r1", true).setParameter("r2", true); } else if ("unresolved".equals(status)) { return query.setParameter("r1", false).setParameter("r2", false); } else { return query.setParameter("r1", true).setParameter("r2", false); } } /** * Sets paginatation parameters * * @param query JPA query * @param start the first item * @param limit how many items to return (use 0 for unlimited result) * @throws IllegalArgumentException if any of the integer parameters is lesser than 0 */ protected void applyPaginationParameters(Query query, int start, int limit) { query.setFirstResult(start); if (limit != 0) { query.setMaxResults(limit); } } }