springData QueryDslPredicateExecutor 多条件分页查询

布满荆棘的人生 2021-11-09 16:32 972阅读 0赞

一、需要引入以下依赖

  1. <dependency>
  2. <groupId>com.querydsl</groupId>
  3. <artifactId>querydsl-apt</artifactId>
  4. <scope>provided</scope>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.querydsl</groupId>
  8. <artifactId>querydsl-jpa</artifactId>
  9. </dependency>

导入jar包四个

20190805113822593.png

//这个可以很方便的将迭代器变成listIterableUtils.toList()

  1. <dependency>
  2. <groupId>org.apache.commons</groupId>
  3. <artifactId>commons-collections4</artifactId>
  4. <version>4.1</version>
  5. </dependency>
  6. <project>
  7. <build>
  8. <plugins>
  9. ...
  10. <plugin>
  11. <groupId>com.mysema.maven</groupId>
  12. <artifactId>apt-maven-plugin</artifactId>
  13. <version>1.1.3</version>
  14. <executions>
  15. <execution>
  16. <phase>generate-sources</phase>
  17. <goals>
  18. <goal>process</goal>
  19. </goals>
  20. <configuration>
  21. <outputDirectory>target/generated-sources</outputDirectory>
  22. <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
  23. </configuration>
  24. </execution>
  25. </executions>
  26. </plugin>
  27. ...
  28. </plugins>
  29. </build>
  30. </project>

根据以上步骤生不成以Q开头的类

原因:以上配置,放错了位置

  1. <profiles>
  2. <profile>
  3. *****
  4. </profile>
  5. <profiles>

每个profile都有唯一的id,也包含properties属性。这里为每个profile都定义一个名为profiles.active的properties,每个环境的值不同。当我们打包项目时,激活不同的环境,profiles.active字段就会被赋予不同的值

应该放入

  1. <project>
  2. <build>
  3. ***
  4. </build>
  5. </project>

正确的结果:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z3azE5ODQwMzAx_size_16_color_FFFFFF_t_70

  1. 二、Predicate 类的包为 package com.querydsl.core.types;
  2. public interface Predicate extends Expression<Boolean> {
  3. Predicate not();
  4. }
  5. 三、接口 QueryDslPredicateExecutor 所在的包为 package org.springframework.data.querydsl;
  6. import com.querydsl.core.types.OrderSpecifier;
  7. import com.querydsl.core.types.Predicate;
  8. import org.springframework.data.domain.Page;
  9. import org.springframework.data.domain.Pageable;
  10. import org.springframework.data.domain.Sort;
  11. public interface QueryDslPredicateExecutor<T> {
  12. T findOne(Predicate var1);
  13. Iterable<T> findAll(Predicate var1);
  14. Iterable<T> findAll(Predicate var1, Sort var2);
  15. Iterable<T> findAll(Predicate var1, OrderSpecifier... var2);
  16. Iterable<T> findAll(OrderSpecifier... var1);
  17. Page<T> findAll(Predicate var1, Pageable var2);
  18. long count(Predicate var1);
  19. boolean exists(Predicate var1);
  20. }
  21. 四、常用代码(分页)
  22. Repository

注意:

1.导包 import com.querydsl.core.types.dsl.BooleanExpression;

  1. import com.querydsl.core.types.dsl.Expressions;

2.必须执行mvn clean complie命令,然后会生成QRmaOrderDetailSn

  1. public interface RmaOrderDetailSnRepository extends PagingAndSortingRepository<RmaOrderDetailSn,Long>,QueryDslPredicateExecutor<RmaOrderDetailSn> {
  2. /**
  3. * 根据订单号分页查询明细集合
  4. * @param query
  5. * @return
  6. */
  7. default Page<RmaOrderDetailSn> queryPageByOrderCodeInfo(QueryRmaOrderDetailVO query, PageRequest pageRequest){
  8. BooleanExpression booleanExpression = Expressions.asBoolean(true).isTrue();
  9. if(query.getMaterialCodes()!=null&&!StringUtils.isEmpty(query.getMaterialCodes())){
  10. booleanExpression = booleanExpression.and(QRmaOrderDetailSn.rmaOrderDetailSn.materialCode.in(query.getMaterialCodes()));
  11. }
  12. if(query.getMaterialCode()!=""&&!StringUtils.isEmpty(query.getMaterialCode())){
  13. booleanExpression = booleanExpression.and(QRmaOrderDetailSn.rmaOrderDetailSn.materialCode.eq(query.getMaterialCode()));
  14. }
  15. if(query.getMaterialSn()!=""&&!StringUtils.isEmpty(query.getMaterialSn())){
  16. booleanExpression = booleanExpression.and(QRmaOrderDetailSn.rmaOrderDetailSn.materialSn.eq(query.getMaterialSn()));
  17. }
  18. if(query.getSupplierSn()!=""&&!StringUtils.isEmpty(query.getSupplierSn())){
  19. booleanExpression = booleanExpression.and(QRmaOrderDetailSn.rmaOrderDetailSn.supplierSn.eq(query.getSupplierSn()));
  20. }
  21. booleanExpression = booleanExpression.and(QRmaOrderDetailSn.rmaOrderDetailSn.rmaOrderDetail.rmaOrder.receiveGoodsStatus.eq(Boolean.TRUE));
  22. booleanExpression = booleanExpression.and(QRmaOrderDetailSn.rmaOrderDetailSn.rmaOrderDetail.rmaOrder.supplierCode.eq(query.getSupplierCode()));
  23. booleanExpression = booleanExpression.and(QRmaOrderDetailSn.rmaOrderDetailSn.rmaOrderDetail.rmaOrder.branchId.eq(query.getBranchId()));
  24. if(!StringUtils.isEmpty(query.getLegalPersonCode())){
  25. booleanExpression = booleanExpression.and(QRmaOrderDetailSn.rmaOrderDetailSn.rmaOrderDetail.rmaOrder.legalPersonCode.eq(query.getLegalPersonCode()));
  26. }
  27. booleanExpression = booleanExpression.and(QRmaOrderDetailSn.rmaOrderDetailSn.hasReturnFlag.eq(Boolean.FALSE));
  28. booleanExpression = booleanExpression.and(QRmaOrderDetailSn.rmaOrderDetailSn.putInStorageSnFlag.eq(Boolean.FALSE));
  29. return this.findAll(booleanExpression, pageRequest);
  30. }
  31. service
  32. Page<RmaOrderDetailSn> snPage = rmaOrderDetailSnRepository.queryPageByOrderCodeInfo(query, new PageRequest(query.getPageIndex() - 1, query.getPageSize(), new Sort(Sort.Direction.DESC, "id")));
  33. Resource
  34. AllRecords<RmaOrderDetailSn> allRecords = new AllRecords();
  35. allRecords.build(tempList,query);
  36. 封装的返回方法
  37. public void build (Page<T> result, PageVO query) {
  38. this.totalNumber = result.getTotalElements();//总elements
  39. this.pageSize = query.getPageSize();//每页多少elements
  40. this.pageIndex = query.getPageIndex();//当前页数,第一页是0
  41. this.totalPage = result.getTotalPages();//总页数
  42. this.dataList = result.getContent();//内容
  43. }
  44. 四、常用代码(不分页,返回集合在service层)
  45. BooleanExpression last = Expressions.asBoolean(true).isTrue();
  46. last = last.and(QRmaReturnDetailSn.rmaReturnDetailSn.rmaReturnDetail.rmaReturn.status.ne(RmaReturnStatusEnum.cancel.getStatus()));
  47. last = last.and(QRmaReturnDetailSn.rmaReturnDetailSn.rmaReturnDetail.rmaReturn.supplierCode.eq(query.getSupplierCode()));
  48. last = last.and(QRmaReturnDetailSn.rmaReturnDetailSn.rmaReturnDetail.rmaReturn.branchId.eq(query.getBranchId()));
  49. List<RmaReturnDetailSn> rmaReturnDetailSns = IterableUtils.toList(rmaReturnDetailSnRepository.findAll(last));
  50. return rmaReturnDetailSns;
  51. 备注:
  52. 1.如果需要模糊查询
  53. booleanExpression = booleanExpression.and(QRepairOrder.repairOrder.createUserName.like("%"+query.getCreateUserName()+"%"));
  54. 2.复杂条件
  55. booleanExpression = booleanExpression.and(QRmaReturnDetailSn.rmaReturnDetailSn.rmaReturnDetail.rmaReturn.status.
  56. in(RmaReturnStatusEnum.submit.getStatus(),RmaReturnStatusEnum.auditor.getStatus(),RmaReturnStatusEnum.complete.getStatus()));
  57. 3.排序 可以传入多个值,
  58. public Sort(Sort.Direction direction, String... properties) {
  59. this(direction, (List)(properties == null ? new ArrayList() : Arrays.asList(properties)));
  60. }
  61. 4.手工分页方法(如果实在没法用以上分页,可以采用下边手工分页)
  62. 调用方
  63. AllRecords<RepairOrderDetatilTemp> allRecords = new AllRecords();
  64. allRecords.pageUtil (query.getPageIndex(), query.getPageSize(), tempList);
  65. 封装的方法
  66. public void pageUtil (Integer pageIndex, Integer pageSize, List<T> list) {
  67. int length = list.size();
  68. List<T> list1 = list.stream().skip((pageIndex - 1) * pageSize).limit(pageSize).collect(Collectors.toList());
  69. this.totalNumber = length;//总elements
  70. this.pageSize = pageSize;//每页多少elements
  71. this.pageIndex = pageIndex;//当前页数,第一页是0
  72. this.totalPage = (length - 1) / pageSize + 1;//总页数
  73. this.dataList = list1;//内容
  74. }

备注:出现了一下编译报错

  1. [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project setting: Compilation failure
  2. [ERROR] An unknown compilation problem occurred

maven-compiler-plugin 有一个参数 useIncrementalCompilation 设为 fasle

  1. <plugin>
  2. <artifactId>maven-compiler-plugin</artifactId>
  3. <version>${maven.compiler.version}</version>
  4. <configuration>
  5. <source>${java.version}</source>
  6. <target>${java.version}</target>
  7. </configuration>
  8. <useIncrementalCompilation>fasle</useIncrementalCompilation>
  9. </plugin>

发表评论

表情:
评论列表 (有 0 条评论,972人围观)

还没有评论,来说两句吧...

相关阅读