package com.acme.jpa;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
public class GameRepository {
@PersistenceContext
private EntityManager em;
public List<Game> fetchAll() {
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Game> query = criteriaBuilder.createQuery(Game.class);
Root<Game> from = query.from(Game.class);
CriteriaQuery<Game> select = query.select(from);
return em.createQuery(select).getResultList();
}
public List<Game> fetchAllFor(Platform platform) {
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Game> query = criteriaBuilder.createQuery(Game.class);
Root<Game> fromGames = query.from(Game.class);
Join<Game, Platform> platformsOfGame = fromGames.join(Game_.supportedPlatforms);
Predicate givenPlatfromIsAssigned = criteriaBuilder.equal(platformsOfGame.get(Platform_.name), platform.getName());
CriteriaQuery<Game> allGamesForGivenPlatfrom = query.select(fromGames)
.where(givenPlatfromIsAssigned);
return em.createQuery(allGamesForGivenPlatfrom).getResultList();
}
public Platform getPlatform(String platformName) {
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Platform> query = criteriaBuilder.createQuery(Platform.class);
Root<Platform> fromPlatform = query.from(Platform.class);
Predicate platofmIsEqualToGivenName = criteriaBuilder.equal(fromPlatform.get(Platform_.name), platformName);
query.select(fromPlatform).where(platofmIsEqualToGivenName);
return em.createQuery(query).getSingleResult();
}
public List<Game> findOldestGames() {
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Game> query = criteriaBuilder.createQuery(Game.class);
Root<Game> fromGames = query.from(Game.class);
Predicate oldestYear = criteriaBuilder.equal(fromGames.get(Game_.year), oldestYear());
query.select(fromGames).where(oldestYear);
return em.createQuery(query).getResultList();
}
private Integer oldestYear() {
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Integer> query = criteriaBuilder.createQuery(Integer.class);
Root<Game> fromGames = query.from(Game.class);
Expression<Integer> oldestYear = criteriaBuilder.min(fromGames.get(Game_.year));
return em.createQuery(query.select(oldestYear)).getSingleResult();
}
}