【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.多條件查詢

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM