【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); }
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.多条件查询