SpringDataJPA——使用EntityManager利用原生SQL自定义复杂查询

原生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快速实现动态查询

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值