博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
拥抱JPA规范
阅读量:6825 次
发布时间:2019-06-26

本文共 6864 字,大约阅读时间需要 22 分钟。

前言

在上文Hibernate使用中曾经提到过Hibernate是JPA实现的一个超集,但当时使用的都是原生Hibernate,在本文中我们将拥抱JPA规范,重构持久化层。

JPA+HIbernate配置

下面是ApplicationContxt文件

XML
update
org.hibernate.dialect.MySQLDialect
true

JPA动态查询

javaCriteriaBuilder cb=entityManager.getCriteriaBuilder();CriteriaQuery
query=cb.createQuery(clazz);//clazz是你想要转换的类型,就是你的Entity.claa,如果你查的是count,就是Long.claaRoot
root=query.from(clazz);query.select(root);//选取实体//选择的条件List
predicates=new ArrayList
();predicates.add(cb.equal(..));predicates.add(..);...query.where(cb.and(predicates.toArray(new Predicate[predicates.size()])));

上面通过数组来组合与条件,还有一种方式:

javaPredicate predicate=cb.conjunction();//交集predicate=cb.and(predicate,cb.equal(root.get("sex"),condition.get("sex")));Predicate predicate=cb.disjunction();//并集predicate=cb.or(predicate,cb.equal(root.get("sex"),condition.get("sex")));

JPA里面对类型控制比较严格,如下所示:

java//比较大小cb.gt(root.
get("degree"),(Integer) condition.get("degree"));//likecb.like(root.get("user").
get("nickName"),keyword)//in 条件root.get("tags").in(condition.get("tag"))

对于关联映射,如果是ToOne,你可以连写get

root.get("user").get("account");

对于ToMany的,你可以使用Join

javaCriteriaQuery
criteria = cb.createQuery((Class
) Parent.class);Root
parent = criteria.from(Parent.class);criteria.select((Selection
) parent);SetJoin
children = parent.joinSet("children", JoinType.LEFT);Predicate sexPredicate = cb.equal(children.get("sex"), "MALE");parent.fetch(children);//parent.fetch("children");//try also thiscriteria.where(sexPredicate);

JPA分页

取分页内容

javaTypedQuery
typedQuery=entityManager.createQuery(query);typedQuery.setFirstResult((pageNum-1)*PAGE_SIZE);typedQuery.setMaxResults(PAGE_SIZE);

取查询数目

javaCriteriaBuilder cb=entityManager.getCriteriaBuilder();CriteriaQuery
query=cb.createQuery(Long.class);query.select(cb.count(query.from(clazz)));//选取实体return entityManager.createQuery(query).getSingleResult();

JPA 动态更新

javaCriteriaBuilder cb=entityManager.getCriteriaBuilder();CriteriaUpdate
op=cb.createCriteriaUpdate(clazz);Root
root=op.from(clazz);op.set(fieldName, value);op.where(cb.equal(root.get(keyName), delta.get(keyName)));entityManager.createQuery(op).executeUpdate();

JPQL

JPA的JPQL语句和Hibernate的HQL语句十分类似

javaQuery query=entityManager.createQuery("SELECT r FROM Resume r WHERE r.user.id=:userId");query.setParameter("id", userId);return (Resume) query.getSingleResult();

JPA CRUD

javapublic interface GenericDAO
{ public void insert(T t); public void update(T t); public void simpleUpdate(Map
delta); public void delete(T t); public T load(Long id); public void refresh(T t); public List
list(int pageNum); public Long count(); public List
findByCondition(Map
condition); public Long countByCondition(Map
condition);}@SuppressWarnings("unchecked")public class GenericDAOImpl
implements GenericDAO
{ private Class
clazz; @PersistenceContext protected EntityManager entityManager; protected Session getCurrentSession() { return entityManager.unwrap(Session.class); } public GenericDAOImpl(){ //取得T的类型变量 ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass(); clazz = (Class
) type.getActualTypeArguments()[0]; } public void insert(T t) { entityManager.persist(t); } public void update(T t) { entityManager.merge(t); } public void simpleUpdate(Map
delta) { Field[] fields=clazz.getDeclaredFields(); CriteriaBuilder cb=entityManager.getCriteriaBuilder(); CriteriaUpdate
op=cb.createCriteriaUpdate(clazz); Root
root=op.from(clazz); String keyName="id";//默认选择基准为Id //调整选择域 if(delta.containsKey("keyName")) keyName=(String) delta.get("keyName"); for(Field field:fields){ String fieldName=field.getName(); if(fieldName==keyName) continue; if(delta.containsKey(fieldName)){ op.set(fieldName, delta.get(fieldName)); } } op.where(cb.equal(root.get(keyName), delta.get(keyName))); entityManager.createQuery(op).executeUpdate(); } public void delete(T t) { entityManager.remove(t); } public T load(Long id) { return (T) entityManager.find(clazz, id); } public List
list(int pageNum) { CriteriaBuilder cb=entityManager.getCriteriaBuilder(); CriteriaQuery
query=cb.createQuery(clazz); Root
root=query.from(clazz); query.select(root);//选取实体 query.orderBy(cb.desc(root.get("created")));//排序 TypedQuery
typedQuery=entityManager.createQuery(query); if(pageNum>0){ typedQuery.setFirstResult((pageNum-1)*SbeatConfig.PAGE_SIZE); typedQuery.setMaxResults(SbeatConfig.PAGE_SIZE); } return typedQuery.getResultList(); } public void refresh(T t) { entityManager.refresh(t); } public Long count() { //返回数目 CriteriaBuilder cb=entityManager.getCriteriaBuilder(); CriteriaQuery
query=cb.createQuery(Long.class); query.select(cb.count(query.from(clazz)));//选取实体 return entityManager.createQuery(query).getSingleResult(); } public List
findByCondition( Map
condition) { Field[] fields=clazz.getDeclaredFields(); CriteriaBuilder cb=entityManager.getCriteriaBuilder(); CriteriaQuery
query=cb.createQuery(clazz); Root
root=query.from(clazz); query.select(root);//选取实体 //选择的条件 List
predicates=new ArrayList
(); for(Field field:fields){ String fieldName=field.getName(); if(condition.containsKey(fieldName)){ predicates.add(cb.equal(root.get(fieldName), condition.get(fieldName))); } } query.where(cb.and(predicates.toArray(new Predicate[predicates.size()]))); query.orderBy(cb.desc(root.get("created"))); TypedQuery
typedQuery=entityManager.createQuery(query); Integer pageNum=0; if(condition.containsKey(pageNum)){ pageNum=(Integer) condition.get("pageNum"); } if(pageNum>0){ typedQuery.setFirstResult((pageNum-1)*SbeatConfig.PAGE_SIZE); typedQuery.setMaxResults(SbeatConfig.PAGE_SIZE); } return typedQuery.getResultList(); } public Long countByCondition(Map
condition) { Field[] fields=clazz.getDeclaredFields(); CriteriaBuilder cb=entityManager.getCriteriaBuilder(); CriteriaQuery
query=cb.createQuery(Long.class); Root
root=query.from(clazz); query.select(cb.count(root));//选取实体 List
predicates=new ArrayList
(); for(Field field:fields){ String fieldName=field.getName(); if(condition.containsKey(fieldName)){ predicates.add(cb.equal(root.get(fieldName), condition.get(fieldName))); } } query.where(cb.and(predicates.toArray(new Predicate[predicates.size()]))); return entityManager.createQuery(query).getSingleResult(); }}

转载地址:http://zqykl.baihongyu.com/

你可能感兴趣的文章
安装jupyter后,使用时显示找不到命令(command not found)
查看>>
我的友情链接
查看>>
xshell输入中文显示问号问题
查看>>
Linux下搭建FTP服务器
查看>>
一篇关于USB口管理的文章
查看>>
sharepoint 2010中部署webpart
查看>>
【3】搭建HA高可用hadoop-2.3(部署配置hadoop--cdh5.1.0)
查看>>
dhcp服务架构
查看>>
去除微信二维码白色背景
查看>>
display分页程序流程
查看>>
Exchange 2013SP1和O365混合部署系列四
查看>>
PHP预定义变量
查看>>
Nginx启动出错
查看>>
我的友情链接
查看>>
ETag负载均衡的相关问题
查看>>
一段简单的javascript生成随机密码代码
查看>>
(MyISAM) Indexed Sequential Access Method
查看>>
服务器端IIS中部署带Office组件程序
查看>>
RHEL 7.0 正式版抢先体验
查看>>
thinkphp5跨数据库查询
查看>>