使用EntityManager
原生SQL查询方法
在这里进行记录以下使用过程,注释已经很清晰
@Override
@Transactional(readOnly = true)
public Page<AreaInfoEntity> findAllByParentIdByPageingQuery(String parentId, Integer pageNum, Integer pageSize) {
PageRequest pageRequest = PageRequest.of(pageNum,pageSize);
//由于当前节点的子节点id是在当前节点id的基础上加上三个字符,这里将parentID拼接成可以匹配子节点的正则表达式
//'^001003.{3}$'
String regex = "'^"+parentId+".{3}$'";
System.err.println("正则表达式:"+regex);
String sql = "select * from area_info where id REGEXP "+regex;
//System.err.println("sql语句:"+sql);
Query query = entityManager.createNativeQuery(sql);
//将结果转换为Map,返回后的map中的key是数据库表字段,如果用实体接收,使用@JsonAlias设置一下在反序列化时进行映射
query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
//查询总量total
String countSql = "select count(*) from area_info where id REGEXP "+regex;
//System.err.println("sql语句:"+countSql);
//获取总记录条数
Query countQuery = entityManager.createNativeQuery(countSql);
BigInteger total = (BigInteger) countQuery.getSingleResult();
//查询分页信息
Integer offSet = pageNum*pageSize;
//设置起始位置偏移量和每一页要返回的记录数
query.setFirstResult(offSet).setMaxResults(pageSize);
List<Map<String,Object>> resultList = query.getResultList();
List<AreaInfoEntity> list = resultList.stream().map(a -> mapConvertToObject(a, AreaInfoEntity.class)).collect(Collectors.toList());
//封装分页信息 PageImpl类实现了Page<T>接口
return new PageImpl<>(list, pageRequest, total.longValue());
}
/**
* 将map转换为POJO对象
* @param map map
* @param beanClass class
* @return r
*/
public static <T> T mapConvertToObject(Map<String, Object> map, Class<T> beanClass) {
ObjectMapper mapper = new ObjectMapper();
return mapper.convertValue(map, beanClass);
}
记录以下学习过程中找到的其他文章地址
官方文档-翻译
[Spring data jpa] 使用EntityManager 原生sql使用(详细)
Spring Data Jpa使用 EntityManager 自定义复杂查询
springDataJpa入门教程
springdata jpa使用Example快速实现动态查询