package cz.coffei.foodo.data.dao; import cz.coffei.foodo.data.entities.IngredientGroup; import cz.coffei.foodo.data.entities.IngredientGroup_; import cz.coffei.foodo.data.exceptions.EntityInvalidException; import javax.ejb.Stateless; import javax.inject.Inject; import javax.persistence.EntityManager; import javax.persistence.NoResultException; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import java.util.List; /** * Created by jtrantin on 26.7.15. */ @Stateless public class IngredientGroupDao { @Inject private EntityManager em; public void create(IngredientGroup group) throws EntityInvalidException { if(group.getId()!=null) throw new EntityInvalidException("entity ha non-null ID"); em.persist(group); } public void update(IngredientGroup group) throws EntityInvalidException { if(group.getId()==null) throw new EntityInvalidException("entity has no ID"); try { IngredientGroup oldGroup = getGroupById(group.getId()); group.setIngredients(oldGroup.getIngredients()); } catch (NoResultException e) { throw new EntityInvalidException("entity has invalid ID", e); } em.merge(group); } public void delete(IngredientGroup group) throws EntityInvalidException { if(group.getId()==null) throw new EntityInvalidException("entity has no ID"); if(!em.contains(group)) { group = em.merge(group); } em.remove(group); } public IngredientGroup getGroupById(Long id) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<IngredientGroup> query = cb.createQuery(IngredientGroup.class); Root<IngredientGroup> root = query.from(IngredientGroup.class); query.select(root); query.where(cb.equal(root.get(IngredientGroup_.id), id)); TypedQuery<IngredientGroup> typedQuery = em.createQuery(query); return typedQuery.getSingleResult(); } public List<IngredientGroup> getAllGroups() { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<IngredientGroup> query = cb.createQuery(IngredientGroup.class); Root<IngredientGroup> root = query.from(IngredientGroup.class); query.select(root); return em.createQuery(query).getResultList(); } public List<IngredientGroup> getAllRequiredGroups() { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<IngredientGroup> query = cb.createQuery(IngredientGroup.class); Root<IngredientGroup> root = query.from(IngredientGroup.class); query.select(root); query.where(cb.equal(root.get(IngredientGroup_.required), true)); return em.createQuery(query).getResultList(); } public IngredientGroup fetchCollections(IngredientGroup group) { if(!em.contains(group)) { group = em.merge(group); } group.getIngredients().size(); return group; } }