package com.hrms.dao.impl;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.Collection;
import java.util.List;
import javax.annotation.Resource;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateTemplate;
import com.hrms.dao.IGenericDao;
import com.hrms.util.Page;
public class GenericDaoImpl<T, PK extends Serializable> implements
IGenericDao<T, PK> {
private Class<T> persistentClass;
private HibernateTemplate hibernateTemplate;
@SuppressWarnings("unchecked")
public GenericDaoImpl() {
if (this.persistentClass == null) {
this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}
}
protected Class<T> getPersistentClass() {
return this.persistentClass;
}
public void setPersistentClass(Class<T> persistentClass) {
this.persistentClass = persistentClass;
}
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
@Resource
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
@SuppressWarnings("unchecked")
public List<T> findByHql(String hql) {
return getSession().createQuery(hql).list();
}
@SuppressWarnings("unchecked")
public List<T> findAll() {
return getHibernateTemplate().find(
"from " + getPersistentClass().getName());
}
@SuppressWarnings("unchecked")
public List<T> findAllByDesc(PK id) {
return getHibernateTemplate().find(
"from " + getPersistentClass().getName() + " order by " + id
+ "desc");
}
@SuppressWarnings("unchecked")
public T findById(PK id) {
T t = (T) getHibernateTemplate().get(getPersistentClass(), id);
clear();
flush();
return t;
}
public boolean save(T entity) {
getHibernateTemplate().save(entity);
return true;
}
public boolean saveOrUpdate(T entity) {
getHibernateTemplate().saveOrUpdate(
getHibernateTemplate().merge(entity));
return true;
}
@SuppressWarnings("unchecked")
public boolean update(T entity) {
T object = (T) getHibernateTemplate().merge(entity);
getHibernateTemplate().update(object);
return true;
}
public boolean deleteById(PK id) {
getHibernateTemplate().delete(findById(id));
return true;
}
public boolean delete(T entity) {
getHibernateTemplate().delete(entity);
return true;
}
public boolean deleteAll(Collection<T> entities) {
return true;
}
@SuppressWarnings("unchecked")
public List<T> findAllByPage(String hql, int start, int number) {
Session session = this.getHibernateTemplate().getSessionFactory()
.openSession();
Query query = session.createQuery(hql);
int startRow = (start) * number - number;
query.setFirstResult(startRow);
query.setMaxResults(number);
List<T> listPage = (List<T>) query.list();
session.close();
return listPage;
}
@SuppressWarnings("unchecked")
public List<T> getListByPage(String hql,int start) {
Session session = this.getHibernateTemplate().getSessionFactory()
.openSession();
Query query = session.createQuery(hql);
List<T> list = (List<T>) query.list();
int totalSize = list.size();
Page page = new Page(start, totalSize);
int number = page.getPageSize();
int startRow = (start) * number - number;
query.setFirstResult(startRow);
query.setMaxResults(number);
List<T> listPage = (List<T>) query.list();
session.close();
return listPage;
}
@SuppressWarnings("unchecked")
public int getListSize(String hql) {
Session session = this.getHibernateTemplate().getSessionFactory()
.openSession();
Query query = session.createQuery(hql);
List<T> listPage = (List<T>) query.list();
session.close();
return listPage.size();
}
@SuppressWarnings("unchecked")
public List<T> findAllByPage(String hql, int start, int number,Object[] values) {
Query query = getSession().createQuery(hql);
for (int i = 0; i < values.length; i++) {
query.setParameter(i, values[i]);
}
query.setFirstResult(start);
query.setMaxResults(number);
List list = query.list();
return list;
}
@SuppressWarnings("unchecked")
public List<T> getListByPage(int currentPage, int pageSize) {
Session session = this.getHibernateTemplate().getSessionFactory()
.openSession();
Query query = session.createQuery("from "
+ this.getPersistentClass().getName());
int startRow = (currentPage) * pageSize - pageSize;
query.setFirstResult(startRow);
query.setMaxResults(pageSize);
List<T> listPage = (List<T>) query.list();
session.close();
return listPage;
}
@SuppressWarnings("unchecked")
public List<T> getListByPageByDesc(int currentPage, int pageSize,String orderId) {
Session session = this.getHibernateTemplate().getSessionFactory()
.openSession();
Query query = session.createQuery("from "
+ getPersistentClass().getName() + " order by " + orderId
+ " desc");
int startRow = (currentPage) * pageSize - pageSize;
query.setFirstResult(startRow);
query.setMaxResults(pageSize);
List<T> listPage = (List<T>) query.list();
session.close();
return listPage;
}
public int getSize() {
return getHibernateTemplate().find(
"from " + this.getPersistentClass().getName()).size();
}
public Session getSession() {
return getHibernateTemplate().getSessionFactory().getCurrentSession();
}
public void flush() {
getSession().flush();
}
public void clear() {
getSession().clear();
}
public void sessionClose() {
getSession().close();
}
}