zoukankan      html  css  js  c++  java
  • 【spring boot】11.spring-data-jpa的详细介绍和复杂使用

    ====================================================================================================

    项目地址:GitHub地址

    复杂jpa查询 会陆续在本项目补充完善!!!!

    ====================================================================================================

    这篇专门用来对spring-data-jpa的详细介绍和复杂使用做一个阐述。

    参考文档:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/

    这一篇没有系统的使用说明指导文档,只是将项目中涉及到的spring-data-jpa的复杂使用做一个记录和总结使用!!

    整片参考项目代码GitHub地址:https://github.com/AngelSXD/myagenorderdiscount

    过程中参考的文章:

      http://blog.csdn.net/mendeliangyang/article/details/52366799/

      http://blog.csdn.net/lihuapiao/article/details/48782843【关于多表关联查询,这两个链接中有所体现】

    ====================================================================================================

    1.分页

    关于分页的使用,无非就是前台传来《1.当前页码》《2.一页几条》,再多一点就是《3.按照什么排序,升序或降序》

    所以,很简单的

      1》Repository层

    import com.agen.orderdiscount.entity.Discount;
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.Pageable;
    import org.springframework.data.jpa.repository.JpaRepository;
    
    /**
     * discount 折扣持久化层
     *
     * @author SXD
     * @date 2018/1/8
     */
    public interface DiscountRepository extends JpaRepository<Discount,String>{
    
        @Override
        Page<Discount> findAll(Pageable pageable);
    }
    View Code

      2》Controller层

    @RequestMapping("allDiscount")
        @ResponseBody
        public Page<Discount> allDiscount(){
            Sort sort = new Sort(Sort.Direction.DESC,"editDate");  //sort,根据Discount实体中的editDate字段进行降序
            Pageable pageable = new PageRequest(0,10,sort);      //实例化分页对象,第0页,每页10条,且传入sort
            Page<Discount> page = discountRepository.findAll(pageable); //调用repository层分页查找方法,返回结果
            return  page;
        }

      3》传给前台以后,解析并展示数据

    function get10Disocount(){
        $.ajax({url:"admin/allDiscount",
            type:"post",
            traditional:true,
            data:{pageNumber:$("input[name='pageNumber']").val(),pageSize:$("input[name='pageSize']").val()},
            success:function(data){
                if(data != null){
                    var temp = "";
                    //当前页
                    if(data.content.length <10){
                        $("input[name='pageNumber']").val(data.number);
                    }else{
                        $("input[name='pageNumber']").val(parseInt(data.number)+1);
                    }
                    //当前页多少条
                    $("input[name='pageSize']").val(data.size);
                    //循环分页的content,就是一个List
                    $.each(data.content,function(i,d){
                        temp += '<div class="row">'
                            +'<div class="alert alert-info">'
                            +'<div class="row">'
                            +' <div class="col-lg-8 col-sm-12 col-md-12 col-xs-12 text-left">'
                            +' <input type="hidden" name="adminId" value="'+d.adminId+'"/>'
                            +' <u name="adminName">'+d.adminName+'</u>'
                            +' </div>'
                            +' </div>'
                            +'<div class="row">'
                            +' <div class="col-lg-6 col-sm-6 col-md-6 col-xs-6 text-left">'
                            +' <input type="hidden" name="productId" value="'+d.productId+'"/>'
                            +' <small name="productName">'+d.productName+'</small>'
                            +' </div>'
                            +' <div class="col-lg-6  col-sm-6  col-md-6  col-xs-6 text-right">'
                            +' <input type="hidden" name="detailed" value="'+d.discountId+'~'+d.productPrice+'~'+d.priceDiscount+'~'+d.disCre1+'"/>'
                            +' <small>¥<em>'+d.dicountPrice+'</em>&nbsp;折扣价</small>'
                            +' </div>'
                            +'</div>'
                            +'</div>'
                            +'</div>';
    
                    });
                    $('.detail .begon').children(":first").before(temp);
    
                }
            }
        });
    }
    View Code

    ========================================================================================================

    2.spring data jpa  复杂查询之  多条件in查询 +分页

    想要多条件in查询的话,需要repository接口继承另一个接口JpaSpecificationExecutor

    所以

      1》repository层应该如下:

    import com.agen.orderdiscount.entity.Discount;
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.Pageable;
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
    
    /**
     * discount 折扣持久化层
     *
     * @author SXD
     * @date 2018/1/8
     */
    public interface DiscountRepository extends JpaRepository<Discount,String>,JpaSpecificationExecutor<Discount> {
    
        /**
         * 根据 adminId 和 productId 查找折扣
         * @param adminId
         * @param productId
         * @return
         */
        Discount findDiscountByAdminIdAndProductId(Integer adminId,Integer productId);
    
        @Override
        Page<Discount> findAll(Pageable pageable);
    
    }
    View Code

      2》controller层【我没有写service层,所以直接在controller层拼接的条件】

     @RequestMapping("queryDiscount")
        @ResponseBody
        public Page<Discount> queryDiscount(int pageNumber,int pageSize,String adminIds,String productIds){
    
            List<Integer> adminArr = getIntArr(adminIds);
            List<Integer> productArr = getIntArr(productIds);
            Pageable pageable = new PageRequest(pageNumber,pageSize);
    
            Page<Discount> discountList = discountRepository.findAll(new Specification<Discount>() {
                @Override
                public Predicate toPredicate(Root<Discount> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                    List<Predicate> list = new ArrayList<>();
                    if(!adminArr.isEmpty()){
                        list.add(root.get("adminId").in(adminArr));
                    }
                    if(!productArr.isEmpty()){
                        list.add(root.get("productId").in(productArr));
                    }
                    criteriaQuery.orderBy(criteriaBuilder.desc(root.get("editDate")));
    
                    Predicate[] predicates = new Predicate[list.size()];
                    predicates = list.toArray(predicates);
                    return criteriaBuilder.and(predicates);
                }
            },pageable);
    
            return discountList;
        }
    
    
        public List<Integer> getIntArr(String str){
            if(Objects.nonNull(str) && str.length()>0){
                List<Integer> adminArr =  Arrays.stream(str.split(",")).map(s->Integer.valueOf(s)).collect(Collectors.toList());
                return  adminArr;
            }else{
                return new ArrayList<>();
            }
    
        }
    View Code

      如果不想分页,返回List<Discount>的话,可以不用传入pageable参数即可!!

      3》页面展示 ajax【相对于上面1.分页,仅仅多传了需要查询的条件字段的值而已】

    function get10Disocount(flag){
    
        var json = new Object();
        json.pageNumber = $("input[name='pageNumber']").val();
        json.pageSize = $("input[name='pageSize']").val();
        if(flag == "query"){
            json.adminIds = $(".checkedAdminIds").val();
            json.productIds = $(".checkedProductIds").val();
        }
    
        $.ajax({url:"admin/queryDiscount",
            type:"post",
            traditional:true,
            data:json,
            success:function(data){
                if(data != null){
                    var temp = "";
                    //当前页
                    if(data.content.length <10){
                        $("input[name='pageNumber']").val(data.number);
                        if(data.content.length == 0){
                            $(".moreDetail u").text("暂无数据");
                        }else{
                            $(".moreDetail u").text("人家也是有底线的");
                        }
                    }else{
                        $("input[name='pageNumber']").val(parseInt(data.number)+1);
                        $(".moreDetail u").text("...加载更多...");
                    }
                    //当前页多少条
                    $("input[name='pageSize']").val(data.size);
                    //循环分页的content,就是一个List
                    $.each(data.content,function(i,d){
                        temp += '<div class="row">'
                            +'<div class="alert alert-info">'
                            +'<div class="row">'
                            +' <div class="col-lg-8 col-sm-12 col-md-12 col-xs-12 text-left">'
                            +' <input type="hidden" name="adminId" value="'+d.adminId+'"/>'
                            +' <u name="adminName">'+d.adminName+'</u>'
                            +' </div>'
                            +' </div>'
                            +'<div class="row">'
                            +' <div class="col-lg-6 col-sm-6 col-md-6 col-xs-6 text-left">'
                            +' <input type="hidden" name="productId" value="'+d.productId+'"/>'
                            +' <small name="productName">'+d.productName+'</small>'
                            +' </div>'
                            +' <div class="col-lg-6  col-sm-6  col-md-6  col-xs-6 text-right">'
                            +' <input type="hidden" name="detailed" value="'+d.discountId+'~'+d.productPrice+'~'+d.priceDiscount+'~'+d.disCre1+'"/>'
                            +' <small>¥<em>'+d.dicountPrice+'</em>&nbsp;折扣价</small>'
                            +' </div>'
                            +'</div>'
                            +'</div>'
                            +'</div>';
    
                    });
    
                    $('.detail .begon').children(".moreDetail").before(temp);
    
                }else{
                    $(".moreDetail u").text("暂无数据");
                }
            }
        });
    }
    View Code

    ==============================================================================================================

    3.多条件查询

  • 相关阅读:
    jquery对象中 “冒号” 详解
    vscode自定以vue代码模板
    Vue项目开发环境proxyTable反向代理,生产环境下服务接口地址找不到的解决
    JS函数的节流和防抖
    BFC-块状格式化上下文
    c# 鼠标钩子
    C# 以管理员身份运行WinForm程序
    样式更换
    Revert to this revision 和 Revert changes from this revision 区别
    人工智能几行代码实现换脸
  • 原文地址:https://www.cnblogs.com/sxdcgaq8080/p/7894828.html
Copyright © 2011-2022 走看看