====================================================================================================
項目地址: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); }
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> 折扣價</small>' +' </div>' +'</div>' +'</div>' +'</div>'; }); $('.detail .begon').children(":first").before(temp); } } }); }
========================================================================================================
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); }
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<>();
}
}
如果不想分頁,返回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> 折扣價</small>' +' </div>' +'</div>' +'</div>' +'</div>'; }); $('.detail .begon').children(".moreDetail").before(temp); }else{ $(".moreDetail u").text("暫無數據"); } } }); }
==============================================================================================================
3.多條件查詢
