package com.netsdar.common.jpa;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.dao.DataAccessException;
import org.springframework.transaction.annotation.Transactional;
import com.netsdar.common.Page;
import com.netsdar.common.Result;
import com.netsdar.utils.PageUtil;
public class BaseJpaDao<T> {
// @PersistenceUnit(unitName="jpa")
// protected EntityManagerFactory emf;
//
// @Resource(name="entityManagerFactory")
// protected void setFactory(
// EntityManagerFactory entityManagerFactory) {
// // TODO Auto-generated method stub
// super.setEntityManagerFactory(entityManagerFactory);
// }
protected EntityManager em;
@PersistenceContext
public void setEntityManager(EntityManager em) {
this.em = em;
}
public void saveOracle(T t){
try {
em.getTransaction().begin();
em.persist(t);
em.getTransaction().commit();
} catch (DataAccessException e) {
em.getTransaction().rollback();
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void updateOracle(T t){
try {
em.getTransaction().begin();
em.merge(t);
em.getTransaction().commit();
} catch (DataAccessException e) {
em.getTransaction().rollback();
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Transactional
public void save(T t){
em.persist(t);
}
@Transactional
public void update(T t){
em.merge(t);
}
public T getByPk(Class<T> clazz,Object id){
return em.find(clazz, id);
}
public long getTotalCount(String queryString , Object...values){
String temp = "select count(*) "+queryString.substring(queryString.indexOf("from"));
Query query = em.createQuery(temp);
for(int pos = 0,length = values.length ; pos < length ; pos++){
query.setParameter(pos+1,values[pos]);
}
return (Long) query.getSingleResult();
}
@SuppressWarnings("unchecked")
public List<T> find(Page page , String queryString , Object...values){
List<T> list = null;
if(page == null){
list = this.find(0,queryString, values);
}else{
if(page.getTotalCount()<=0){
page = PageUtil.createPage(page, getTotalCount(queryString, values));
}
Query query = em.createQuery(queryString);
for(int pos = 0,length = values.length ; pos < length ; pos++){
query.setParameter(pos+1,values[pos]);
}
query.setFirstResult(page.getBeginIndex());
query.setMaxResults(page.getEveryPage());
list = query.getResultList();
}
return list;
}
@SuppressWarnings("unchecked")
public List<T> find(int size , String queryString , Object...values){
List<T> list = null;
Query query = em.createQuery(queryString);
for(int pos = 0,length = values.length ; pos < length ; pos++){
query.setParameter(pos+1,values[pos]);
}
if(size!=0){
query.setMaxResults(size);
}
list = query.getResultList();
return list;
}
@SuppressWarnings("unchecked")
public Result<T> findForResult(Page page , String queryString , Object...values){
List<T> list = null;
if(page == null){
list = this.find(0,queryString, values);
}else{
if(page.getTotalCount()<=0){
page = PageUtil.createPage(page, getTotalCount(queryString, values));
}
Query query = em.createQuery(queryString);
for(int pos = 0,length = values.length ; pos < length ; pos++){
query.setParameter(pos+1,values[pos]);
}
query.setFirstResult(page.getBeginIndex());
query.setMaxResults(page.getEveryPage());
list = query.getResultList();
}
return new Result<T>(page, list);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public List<Map> query(Page page , String queryString , Object...values){
List<Map> list = null;
if(page == null){
list = this.query(0,queryString, values);
}else{
if(page.getTotalCount()<=0){
page = PageUtil.createPage(page, getTotalCount(queryString, values));
}
Query query = em.createQuery(queryString);
for(int pos = 0,length = values.length ; pos < length ; pos++){
query.setParameter(pos+1,values[pos]);
}
query.setFirstResult(page.getBeginIndex());
query.setMaxResults(page.getEveryPage());
list = query.getResultList();
}
return list;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public Result<Map> queryForResult(Page page , String queryString , Object...values){
List<Map> list = null;
if(page == null){
list = this.query(0,queryString, values);
}else{
if(page.getTotalCount()<=0){
page = PageUtil.createPage(page, getTotalCount(queryString, values));
}
Query query = em.createQuery(queryString);
for(int pos = 0,length = values.length ; pos < length ; pos++){
query.setParameter(pos+1,values[pos]);
}
query.setFirstResult(page.getBeginIndex());
query.setMaxResults(page.getEveryPage());
list = query.getResultList();
}
return new Result<Map>(page, list);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public List<Map> query(int size , String queryString , Object...values){
List<Map> list = null;
Query query = em.createQuery(queryString);
for(int pos = 0,length = values.length ; pos < length ; pos++){
query.setParameter(pos+1,values[pos]);
}
if(size!=0){
query.setMaxResults(size);
}
list = query.getResultList();
return list;
}
}