package com.danielme.demo.springjpahib;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.jpa.QueryHints;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
/**
* Implementation for {@link CountryDao}.
* @author danielme.com
*
*/
@Repository
public class CountryDaoImpl implements CountryDao
{
@PersistenceContext
private EntityManager entityManager;
@Override
@Transactional
public void addAll(List<Country> list)
{
for(Country country : list)
{
entityManager.persist(country);
}
}
@Override
public Country getCountryByName(String name)
{
//JPA Criteria
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Country> query = criteriaBuilder.createQuery(Country.class);
Root<Country> country = query.from(Country.class);
query.where(criteriaBuilder.equal(country.<String>get("name"),criteriaBuilder.parameter(String.class, "param")));
TypedQuery<Country> typedQuery = entityManager.createQuery(query);
typedQuery.setParameter("param", name);
return typedQuery.getResultList().get(0);
// //Hibernate Criteria
// Session session = entityManager.unwrap(Session.class);
// Criteria criteria = session.createCriteria(Country.class);
// criteria.add(Restrictions.eq("name", name));
// return (Country) criteria.uniqueResult();
}
@Override
@Transactional
public void deleteAll()
{
entityManager.createQuery("DELETE FROM Country").executeUpdate();
}
@SuppressWarnings("unchecked")
@Override
public List<Country> getAll()
{
Query query = entityManager.createQuery("from Country");
//stores the query results in the second level cache (if enabled)
query.setHint(QueryHints.HINT_CACHEABLE, true);
return query.getResultList();
}
@Override
public Country getById(Long id)
{
return entityManager.find(Country.class, id);
}
@Override
@Transactional
public void clearAllEntitiesCache()
{
SessionFactory sessionFactory = entityManager.unwrap(Session.class).getSessionFactory();
sessionFactory.getCache().evictEntityRegion(Country.class);
}
@Override
@Transactional
public void clearEntityFromCache(Long id) {
SessionFactory sessionFactory = entityManager.unwrap(Session.class).getSessionFactory();
sessionFactory.getCache().evictEntity(Country.class, id);
}
@Override
@Transactional
public void clearHibernateCache() {
SessionFactory sessionFactory = entityManager.unwrap(Session.class).getSessionFactory();
sessionFactory.getCache().evictEntityRegions();
sessionFactory.getCache().evictCollectionRegions();
sessionFactory.getCache().evictDefaultQueryRegion();
sessionFactory.getCache().evictQueryRegions();
}
}