JPA通用dao包,封装常用功能,具体代码如下
import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
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.Predicate;
import javax.persistence.criteria.Root;
import org.hibernate.SQLQuery;
import org.hibernate.transform.Transformers;
import org.springframework.util.Assert;
/**
*
* JPA通用dao包实现
* @author 丶晓权
*
*/
@SuppressWarnings("unchecked")
public class BaseDaoImpl{
@PersistenceContext
protected EntityManager enmanager;
/**
* 根据ID查询实体对象
* 调用例如:getEntity(UserEntity.class,1)
* @param cls 需要查询实体的class
* @param id 实体对象的ID
* @return 查询到的结果
*/
public<T,ID extends Serializable> T getEntity(Class<T> cls,ID id) {
return this.enmanager.find(cls, id);
}
/**
* 查询全部数据
* 调用例如:findAll(UserEntity.class)
* @param cls 需要查询实体的class
* @return 查询到的结果集
*/
public <T> List<T> findAll(Class<T> cls) {
CriteriaBuilder builder = enmanager.getCriteriaBuilder();
CriteriaQuery<T> query = builder.createQuery(cls);
return enmanager.createQuery(query.select(query.from(cls))).getResultList();
}
/**
* 添加
* @param t 实体对象
*/
public <T> void save(T t) {
Assert.notNull(t);
this.enmanager.persist(t);
}
/**
* 修改
* @param t 实体对象
* @return
*/
public <T> T update(T t) {
Assert.notNull(t);
return this.enmanager.merge(t);
}
/**
* 删除
* @param t
*/
public <T> void delete(T t) {
enmanager.remove(t);
}
/**
*
* 根据实体中不为空字段查询数据库中的数量
* 例如:UserEntity中userName='admin',password=null
* SELECT COUNT(a.id) FROM user AS a WHERE userName='admin'
* @param t 查询条件
* @return 数据库数量
*/
public <T> Integer queryCount(T t) {
try {
//创建查询器
CriteriaBuilder builder = enmanager.getCriteriaBuilder();
CriteriaQuery<Long> query = builder.createQuery(Long.class);
Root<T> root = query.from((Class<T>)t.getClass());
//创建查询条件集合
List<Predicate> paramList =new ArrayList<Predicate>();
//反向映射
Field[] fields = t.getClass().getDeclaredFields();
for (Field field:fields) {
if(java.lang.reflect.Modifier.isFinal(field.getModifiers())){
continue;
}
Field.setAccessible(fields, true);
Object object = field.get(t);
if(object!=null){
//添加查询条件
paramList.add(builder.equal(root.get(field.getName()).as(field.getType()), object));
}
}
query.where(paramList.toArray(new Predicate[paramList.size()]));
//返回查询到的结果
return enmanager.createQuery(query.select(builder.count(root))).getSingleResult().intValue();
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
/**
*
* 根据实体中不为空字段分页查询得到List集合
* 例如:UserEntity中userName='admin',password=null
* SELECT a.* FROM user AS a WHERE userName='admin' LIMIT #{startRow},#{pageSize}
* @param t 查询条件
* @param startRow 分页开始位置
* @param pageSize 分页结束位置
* @return
*/
public <T> List<T> queryList(T t, Integer startRow, Integer pageSize) {
try {
//创建查询器
CriteriaBuilder builder = enmanager.getCriteriaBuilder();
CriteriaQuery<T> query = builder.createQuery((Class<T>)t.getClass());
Root<T> root = query.from((Class<T>)t.getClass());
//创建查询条件集合
List<Predicate> paramList =new ArrayList<Predicate>();
//反向映射
Field[] fields = t.getClass().getDeclaredFields();
for (Field field:fields) {
if(java.lang.reflect.Modifier.isFinal(field.getModifiers())){
continue;
}
Field.setAccessible(fields, true);
Object object = field.get(t);
if(object!=null){
//添加查询条件
paramList.add(builder.equal(root.get(field.getName()).as(field.getType()), object));
}
}
query.where(paramList.toArray(new Predicate[paramList.size()]));
//返回查询到的结果集
return enmanager.createQuery(query.select(root)).setFirstResult(startRow).setMaxResults(pageSize).getResultList();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 根据hql查询数据库
* @param hql hql
* @param cls 需要查询的entity
* @param args 查询参数
* @return 查询的结果集
*/
public<T> List<T> createHqlQuery(String hql,Class<T> cls,Object ...args) {
TypedQuery<T> createQuery = enmanager.createQuery(hql,cls);
for (int i = 0;args!=null&&i < args.length; i++) {
createQuery.setParameter((i+1), args[i]);
}
return createQuery.getResultList();
}
/**
* 根据sql查询数据库的内容
* @param sql 原生态sql
* @param args 查询参数
* @return 查询的结果集
*/
public List<Map<String, ? extends Object>> createSqlMapQuery(String sql, Object... args) {
Query createNamedQuery = enmanager.createNativeQuery(sql);
for (int i = 0;args!=null&&i < args.length; i++) {
createNamedQuery.setParameter((i+1), args[i]);
}
createNamedQuery.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
return createNamedQuery.getResultList();
}
}