package com.sap.pto.dao; import java.util.ArrayList; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.NoResultException; import javax.persistence.NonUniqueResultException; import javax.persistence.TypedQuery; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.sap.pto.adapters.PersistenceAdapter; import com.sap.pto.dao.entities.Fixture; import com.sap.pto.dao.entities.Prediction; import com.sap.pto.dao.entities.User; public class PredictionDAO extends BasicDAO<Prediction> { private static final Logger logger = LoggerFactory.getLogger(PredictionDAO.class); public static List<Prediction> getForUser(User user) { EntityManager em = PersistenceAdapter.getEntityManager(); TypedQuery<Prediction> query = em.createNamedQuery(Prediction.QUERY_BYUSER, Prediction.class); query.setParameter("user", user); List<Prediction> predictions = query.getResultList(); return predictions; } public static List<Prediction> getPastForUser(User user) { EntityManager em = PersistenceAdapter.getEntityManager(); TypedQuery<Prediction> query = em.createNamedQuery(Prediction.QUERY_PASTBYUSER, Prediction.class); query.setParameter("user", user); List<Prediction> predictions = query.getResultList(); return predictions; } public static List<Prediction> getPastForFixture(Fixture fixture) { EntityManager em = PersistenceAdapter.getEntityManager(); TypedQuery<Prediction> query = em.createNamedQuery(Prediction.QUERY_PASTBYFIXTURE, Prediction.class); query.setParameter("fixture", fixture); List<Prediction> predictions = query.getResultList(); return predictions; } public static List<Prediction> getForFixture(Fixture fixture) { EntityManager em = PersistenceAdapter.getEntityManager(); TypedQuery<Prediction> query = em.createNamedQuery(Prediction.QUERY_BYFIXTURE, Prediction.class); query.setParameter("fixture", fixture); List<Prediction> predictions = query.getResultList(); return predictions; } public static List<Prediction> getForUsersAndFixtures(List<User> users, List<Fixture> fixtures) { EntityManager em = PersistenceAdapter.getEntityManager(); TypedQuery<Prediction> query = em.createNamedQuery(Prediction.QUERY_BYUSERSANDFIXTURES, Prediction.class); // JPA can only compare with IDs, not objects ArrayList<Long> fixtureIds = new ArrayList<Long>(); for (Fixture fixture : fixtures) { fixtureIds.add(fixture.getId()); } ArrayList<Long> userIds = new ArrayList<Long>(); for (User user : users) { userIds.add(user.getId()); } query.setParameter("users", userIds); query.setParameter("fixtures", fixtureIds); List<Prediction> predictions = query.getResultList(); return predictions; } public static Prediction getForUserAndFixture(User user, Fixture fixture) { EntityManager em = PersistenceAdapter.getEntityManager(); Prediction prediction = getForUserAndFixture(user, fixture, em); return prediction; } public static Prediction getForUserAndFixture(User user, Fixture fixture, EntityManager em) { try { return (Prediction) em.createNamedQuery(Prediction.QUERY_BYUSERANDFIXTURE).setParameter("userId", user.getId()) .setParameter("fixtureId", fixture.getId()).getSingleResult(); } catch (NoResultException e) { return null; } catch (NonUniqueResultException e) { logger.error("Prediction appears multiple times. This could mean severe database corruption. Fix immediately.", e); throw e; } } }