JPA通用dao包设计
来源:互联网 发布:小缘 大官人知乎 编辑:程序博客网 时间:2024/05/20 09:07
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{@PersistenceContextprotected 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();}}
阅读全文
0 0
- JPA通用dao包设计
- JPA通用Dao类设计
- 通用Dao 设计 2
- Spring+JPA 通用DAO及实现
- spring-data-jpa通用dao的扩展
- DAO组件通用设计方法
- Spring Boot-------JPA——EntityManager构建通用DAO
- Mybatis通用DAO设计封装(mybatis)
- notepad Mybatis通用DAO设计封装
- hibernate的dao层通用设计
- Mybatis通用DAO设计封装(mybatis)
- Mybatis通用DAO设计封装(mybatis)
- 通用DAO
- 通用DAO
- 通用Dao
- JPA之如何设计一个优雅的DAO
- Spring Data JPA 动态拼接条件的通用设计模式
- google app JPA Dao
- 指针与函数_返回局部数据指针问题
- 【Scikit-Learn 中文文档】优化估计器的超参数
- 在Ubuntu中安装eclipse图文详解
- 小程序底部tabBar导航配置(app.json)
- 求3个数最大值和最小值的差
- JPA通用dao包设计
- 多表查询之join关联关系注意事项
- Neo4j简介
- 400 bad request
- 设计模式系列之「适配器模式」
- 交大oj-1012-增长率问题 C++ 总结
- appium 获取html5
- Java 泛型 清晰解读
- Ubuntu下安装R语言和开发环境