package com.medratech.spring.dao;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TemporalType;
public abstract class GenericJpaDao<T, PK extends Serializable> implements
Dao<T, PK> {
@PersistenceContext
private EntityManager entityManager;
protected Class<T> classType;
@SuppressWarnings("unchecked")
public GenericJpaDao() {
this.classType = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}
public EntityManager getEntityManager() {
return entityManager;
}
public Class<T> getClassType() {
return classType;
}
public List<T> findAll() {
@SuppressWarnings("unchecked")
List<T> results = getEntityManager().createQuery(
"select o from " + getClassType().getSimpleName() + " o")
.getResultList();
return results;
}
protected List<T> findByQuery(Query q, Map<String, Object> args) {
if (args != null) {
for (Map.Entry<String, Object> entry : args.entrySet()) {
if (entry.getValue() instanceof Date) {
q.setParameter(entry.getKey(), (Date) entry.getValue(),
TemporalType.TIMESTAMP);
} else if (entry.getValue() instanceof Calendar) {
q.setParameter(entry.getKey(), (Calendar) entry.getValue(),
TemporalType.TIMESTAMP);
} else {
q.setParameter(entry.getKey(), entry.getValue());
}
}
}
@SuppressWarnings("unchecked")
List<T> results = q.getResultList();
return results;
}
protected List<T> findByQuery(Query q, Object[] args) {
if (args != null) {
int position = 1;
for (Object value : args) {
if (value instanceof Date) {
q.setParameter(position++, (Date) value,
TemporalType.TIMESTAMP);
} else if (value instanceof Calendar) {
q.setParameter(position++, (Calendar) value,
TemporalType.TIMESTAMP);
} else {
q.setParameter(position++, value);
}
}
}
@SuppressWarnings("unchecked")
List<T> results = q.getResultList();
return results;
}
public List<T> findByNamedQuery(String queryName, Map<String, Object> args) {
return findByQuery(getEntityManager().createNamedQuery(queryName), args);
}
public List<T> findByNamedQuery(String queryName, Object[] args) {
return findByQuery(getEntityManager().createNamedQuery(queryName), args);
}
public List<T> findByNamedQuery(String queryName) {
return findByQuery(getEntityManager().createNamedQuery(queryName), new Object[]{});
}
public List<T> findByQuery(String query, Map<String, Object> args) {
return findByQuery(getEntityManager().createQuery(query), args);
}
public List<T> findByQuery(String query, Object[] args) {
return findByQuery(getEntityManager().createQuery(query), args);
}
public List<T> findByQuery(String query) {
return findByQuery(getEntityManager().createQuery(query), new Object[]{});
}
public T findById(PK id) {
return getEntityManager().find(getClassType(), id);
}
public T persist(T entity) {
getEntityManager().persist(entity);
return entity;
}
public void flush() {
getEntityManager().flush();
}
public void clear() {
getEntityManager().clear();
}
public void remove(T entity) {
getEntityManager().remove(entity);
}
}