JPA---EntityManager
1、hibernate和jpa的关系
PA是规范,Hibernate是框架,JPA是持久化规范,而Hibernate实现了JPA。
题外的一些思考:如果抛开JPA直接使用Hibernate的注解来定义一个实例,很快发现了几个问题:
- jpa中有Entity, Table,hibernate中也有,但是内容不同
- jpa中有Column,OneToMany等,Hibernate中没有,也没有替代品
hibernate对jpa的支持,不是另提供了一套专用于jpa的注解。一些重要的注解如Column, OneToMany等,hibernate没有提供,这说明jpa的注解已经是hibernate 的核心,hibernate只提供了一些补充,而不是两套注解。要是这样,hibernate对jpa的支持还真够足量,我们要使用hibernate注解就必定要使用jpa。
两个额外的问题:
第一个是问如果想用hibernate注解,是不是一定会用到jpa的。网友的回答:“是。如果hibernate认为jpa的注解够用,就直接用。否则会弄一个自己的出来作为补充”
第二个是问,jpa和hibernate都提供了Entity,我们应该用哪个,还是说可以两个一起用?网友回答说“Hibernate的Entity是继承了jpa的,所以如果觉得jpa的不够用,直接使用hibernate的即可”
2、EntityManager的基本常识 (https://www.cnblogs.com/lone5wolf/p/10940827.html);
2.1EntityManager加入单个sql条件的使用方法:
StringBuilder sql = new StringBuilder(" select *" +
" from * " +
" where sd.parent_id=:parentId");
sql.append(" ORDER BY sort_no DESC limit 1");
//在jpa中加入sql语句
Query query = entityManager.createNativeQuery(sql.toString());
//将查询转为map(key 为字段名全大写)
query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
//将获取到的父级id放入到query中
query.setParameter("parentId",department.getParentId());
//将最终的结果用list集合装起,类型为map结构
List<Map> res = query.getResultList();
//将查询结果属性复制到SysDepartmentVo中
ClassUtils.copyProperties(SysDepartmentVo.class, res, new IdPropertyConvert());
2.2EntityManager加入多个sql条件的使用方法:
//根据部门id查询系统用户信息
StringBuilder sql = new StringBuilder("select distinct *" +
" from * " +
" where 1=1 ");
//将追加的sql的条件加上
buildWhere(sql, sysUserVo);
//将sql语句加入
Query query = entityManager.createNativeQuery(sql.toString());
//将查询结果转为map(key为字段名全部大写)
query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
//将结果装入list集合中类型为map
List<Map> res1 = query.getResultList();
//将查询结果复制属性到sysUserVo里面
List<SysUserVo> sysUserVos = ClassUtils.copyProperties(SysUserVo.class, res1, new IdPropertyConvert());
//追加查询条件部门id,用户名称
private void buildWhere(StringBuilder sql, SysUserVo sysUserVo) {
sql.append(" AND sd.department_id = '" + sysUserVo.getDepartmentId() + "'");
if (StringUtils.isNotEmpty(sysUserVo.getRealName())) {
sql.append(" AND su.real_name like '%" + sysUserVo.getRealName() + "%'");
}
3、直接调用jpa的方法
//直接jpa方法
List<SysDepartment> sysDepartments = departmentRepository.findAllByDepartmentId(departmentId);
//将查询到的结果复制属性
List<SysDepartmentVo> departmentVos = ClassUtils.copyProperties(SysDepartmentVo.class, sysDepartments, new IdPropertyConvert());

浙公网安备 33010602011771号