jpa查询

查询

Lambda单表/多表查询

单表查询

repo层

package com.my.kj.repo;

import java.util.List;
import java.util.Map;

public interface ForumPostsRepo extends JpaRepository<ForumPostsEntity,Long> {
    //使用的jpa内置的方法,在repo层对应service层,所有只需要带两个分页的参数就好了
    Page<ForumPostsEntity> findAll(Specification<ForumPostsEntity> businessSpec, Pageable pageable);

server/serverImpl层

//对应controller层
PageResultVo<List<ForumPostsVo>>pageInfo(ForumPostsDTO forumPostsDTO);
    @Override
    public PageResultVo<List<ForumPostsVo>> pageInfo(ForumPostsDTO forumPostsDTO) {
        //ForumPostsDTO必须继承了PageVO 
        //getFormThemeSpe,就是我的查询条件方法
        Specification<ForumPostsEntity> businessSpec = getFormThemeSpe(forumPostsDTO);
        Pageable pageable = PageRequest.of(forumPostsDTO.getPageNum()-1,forumPostsDTO.getPageSize());
        //findAll我repo层的方法
        Page<ForumPostsEntity> page = forumPostsRepo.findAll(businessSpec,pageable);
        PageResultVo<List<ForumPostsVo>> ret = new PageResultVo<>();
        long totalElements = page.getTotalPages();
        //获取总页数
        ret.setTotal(totalElements);
        if(totalElements>0){
            //把得到的数据使用分页的形式显示出来,使用stream流来输出
            //map将流中的一个值转换成一个新的值
            List<ForumPostsVo> data = page.getContent().stream().map(v -> {
                //再把v转成一个字符串对象
                String dataStr = JsonUtils.toJSON(v);
                再把VO转成一个对象
                return JsonUtils.fromJSON(dataStr,ForumPostsVo.class);
                //通过一个 Stream 对象生成 List 对象
            }).collect(Collectors.toList());
            ret.setData(data);
        }
        return ret;
    }
        //查询条件方法
        private Specification<ForumThemeEntity> getFormThemeSpe(ForumThemeDTO forumTheme1DTO) {
        List<Predicate> predicateList = new LinkedList<>();
        //jpa的方式来判断
        return (root,cq,cb) ->{
            //获取到这个字段值
            String title = forumTheme1DTO.getTitle();
            //字符串判断的方式
            if(StringUtils.isNotBlank(title)){
            	//去掉空格
                title = title.trim();
                //like模糊查询
                predicateList.add(cb.like(root.get("title"),"%"+ title + "%"));
            }
            //数字类型的判断
            Integer degreeOfHeat = forumTheme1DTO.getDegreeOfHeat();
            if(Objects.nonNull(degreeOfHeat)){
                predicateList.add(cb.equal(root.get("degreeOfHeat"),degreeOfHeat));
            }
            //Boolean类型的判断
            Boolean isHot = forumTheme1DTO.getIsHot();
            if(Objects.nonNull(isHot)){
                predicateList.add(cb.equal(root.get("isHot"),isHot));
            }
            String province = locationDTO.getProvince();
            //不为空
            if (StringUtils.isNotBlank(province)) {
                //判断值里面有没有省这个字
                if (province.contains("省")){
                    //有的话把省替换为空
                    province = province.replace("省","");
                 //判断有没有市
                }else if (province.contains("市")){
                    //有就替换
                    province = province.replace("市","");
                }
                province = province.trim();
                predicateList.add(cb.like(root.get("province"), "%" + province + "%"));
            return cb.and(predicateList.toArray(new Predicate[0]));
        };
    }

controller层

    @ApiOperation(value = "查找新闻",notes = "分页查询")
    @PostMapping("/forumPosts/postList")
    public TradeMessages<PageResultVo<List<ForumPostsVo>>>postList(@Validated @RequestBody ForumPostsDTO dto){
        PageResultVo<List<ForumPostsVo>> pageResultVo = forumPostsService.pageInfo(dto);
        return Response.success(pageResultVo);
    }

但这种只适于单表查询,如果是多表的话就不行了


多表查询

repo层

public interface ForumPostsRepo extends JpaRepository<ForumPostsEntity,Long> {
 //value里面查询的p.id什么的就是对应数据库的字段/后面跟的别名(必须要)对应的则是你Vo的字段
 @Query(value = "select p.id,p.title poststitle,theme.title themetitle,p.is_top isTop,p.thumbs thumbs,p.reviews reviews,p.forwarded forwarded,p.tread tread,p.create_user createUser,p.create_time createTime,p.modify_user modifyUser,p.modify_time modifyTime from ys_forum_posts p " +
            " Left JOIN ys_posts_theme_rlt rlt on rlt.post_id=p.id " +
            " Left JOIN ys_forum_theme theme on rlt.theme_id=theme.id " +
            " Left JOIN ys_user u on u.id=p.create_user " +
            //这些都是数据库字段
            " where p.is_delete = 0 and p.is_top = 0 AND p.is_posts=1  and p.status =2 " +
            //如果有查询条件的话,就直接在后面加
            //forumPostsDTO.categoryId对应的是Vo的字段,p.categoryId对于的则是数据库表的字段
            " and  IF (IFNULL(:#{#forumPostsDTO.categoryId},'') != '',p.id = :#{#forumPostsDTO.categoryId}, 1=1) " +
            " and  IF (IFNULL(:#{#forumPostsDTO.title},'') != '', p.title like concat('%',:#{#forumPostsDTO.title},'%'), 1=1) " +
            " and  IF (IFNULL(:#{#forumPostsDTO.isTop},'') != '', p.is_top = :#{#forumPostsDTO.isTop},1 = 1) "+
            " order by p.create_time desc limit :#{#forumPostsDTO.pageStart}, :#{#forumPostsDTO.pageSize} ",nativeQuery = true)
    List<Map<String, Object>> findPostAndTheme(@Param("forumPostsDTO") ForumPostsDTO forumPostsDTO);

    //查询总记录数
    @Query(value = "select count(*) from ys_forum_posts p " +
            " Left JOIN ys_posts_theme_rlt rlt on rlt.post_id=p.id " +
            " Left JOIN ys_forum_theme theme on rlt.theme_id=theme.id " +
            " Left JOIN ys_user u on u.id=p.create_user " +
            " where p.is_delete = 0 and p.is_top = 1 and p.status =2 " +
            " and  IF (IFNULL(:#{#forumPostsDTO.categoryId},'') != '',p.id = :#{#forumPostsDTO.categoryId}, 1=1) " +
            " and  IF (IFNULL(:#{#forumPostsDTO.keywords},'') != '', p.title like concat('%',:#{#forumPostsDTO.keywords},'%'), 1=1) " +
            " and  IF (IFNULL(:#{#forumPostsDTO.isTop},'') != '', p.is_top = :#{#forumPostsDTO.isTop},1 = 1) "+
            " order by p.create_time desc limit :#{#forumPostsDTO.pageStart}, :#{#forumPostsDTO.pageSize} ",nativeQuery = true)
    Long  countPostAndTheme(@Param("forumPostsDTO") ForumPostsDTO forumPostsDTO);

server/serverImpl层

 PageResultVo<List<ForumThemeVo>> pagePostsTheme(ForumPostsDTO forumPostsDTO);
    @Override
    public PageResultVo<List<ForumThemeVo>> pagePostsTheme(ForumPostsDTO forumPostsDTO) {
        forumPostsDTO.countPageStart();
        PageResultVo<List<ForumThemeVo>> pageResultVo = new  PageResultVo<List<ForumThemeVo>>();
        //findPostAndTheme是我repo层的方法
        List<Map<String,Object>> list = forumPostsRepo.findPostAndTheme(forumPostsDTO);
        //查询条件不等于空和大于0的
        if(list!=null && list.size()>0){
            //用stream流输出
            //map将流中的一个值转换成一个新的值
            List<ForumThemeVo> vos = list.stream().map(m -> {
            	//把m转成字符串对象
                String s = JsonUtils.toJSON(m);
                //把得到的结构转换为VO
                ForumThemeVo forumThemeVo = JsonUtils.fromJSON(s,ForumThemeVo.class);
                return forumThemeVo;
            //通过 Stream 生成一个列表
            }).collect(Collectors.toList());
            pageResultVo.setData(vos); 
        }
        //总记录数
        Long total = forumPostsRepo.countPostAndTheme(forumPostsDTO);
        pageResultVo.setTotal(total);
        return pageResultVo;
    }

controller层

    @ApiOperation(value = "查找帖子",notes = "分页查询")
    @PostMapping("/forumPosts/commentList")
    public TradeMessages<PageResultVo<List<ForumThemeVo>>> commentList(@Validated @RequestBody ForumPostsDTO forumPostsDTO) {
        PageResultVo<List<ForumThemeVo>> pageResultVo = forumPostsService.pagePostsTheme(forumPostsDTO);
        return Response.success(pageResultVo);
    }

这种就适用于多表,单表也可以查

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值