springData QueryDslPredicateExecutor 多条件分页查询

一、需要引入以下依赖

<dependency>
	<groupId>com.querydsl</groupId>
	<artifactId>querydsl-apt</artifactId>
	<scope>provided</scope>
</dependency>

<dependency>
	<groupId>com.querydsl</groupId>
	<artifactId>querydsl-jpa</artifactId>
</dependency>

 导入jar包四个

 

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

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.1</version>
</dependency>
<project>
  <build>
  <plugins>
    ...
    <plugin>
    <groupId>com.mysema.maven</groupId>
    <artifactId>apt-maven-plugin</artifactId>
    <version>1.1.3</version>
    <executions>
        <execution>
            <phase>generate-sources</phase>
            <goals>
                <goal>process</goal>
            </goals>
            <configuration>
                <outputDirectory>target/generated-sources</outputDirectory>
                <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
            </configuration>
        </execution>
    </executions>
</plugin>
    ...
  </plugins>
  </build>
</project>

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

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

 

<profiles>
    <profile>
        *****
    </profile>
<profiles>

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

应该放入<build>  中

 <project>
   <build>
      ***
   </build>
 </project>

 正确的结果:

 

二、Predicate 类的包为 package com.querydsl.core.types;

public interface Predicate extends Expression<Boolean> {

 Predicate not();

}

三、接口 QueryDslPredicateExecutor 所在的包为 package org.springframework.data.querydsl;

import com.querydsl.core.types.OrderSpecifier;
import com.querydsl.core.types.Predicate;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;

public interface QueryDslPredicateExecutor<T> {
    T findOne(Predicate var1);

 Iterable<T> findAll(Predicate var1);

 Iterable<T> findAll(Predicate var1, Sort var2);

 Iterable<T> findAll(Predicate var1, OrderSpecifier... var2);

 Iterable<T> findAll(OrderSpecifier... var1);

 Page<T> findAll(Predicate var1, Pageable var2);

 long count(Predicate var1);

 boolean exists(Predicate var1);
}

四、常用代码(分页)

Repository层

 注意:

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

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

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

public interface RmaOrderDetailSnRepository extends PagingAndSortingRepository<RmaOrderDetailSn,Long>,QueryDslPredicateExecutor<RmaOrderDetailSn> {

 /**
 * 根据订单号分页查询明细集合
 * @param query
 * @return
 */
 default Page<RmaOrderDetailSn> queryPageByOrderCodeInfo(QueryRmaOrderDetailVO query, PageRequest pageRequest){


 BooleanExpression booleanExpression = Expressions.asBoolean(true).isTrue();

if(query.getMaterialCodes()!=null&&!StringUtils.isEmpty(query.getMaterialCodes())){
       booleanExpression = booleanExpression.and(QRmaOrderDetailSn.rmaOrderDetailSn.materialCode.in(query.getMaterialCodes()));
 }
if(query.getMaterialCode()!=""&&!StringUtils.isEmpty(query.getMaterialCode())){
       booleanExpression = booleanExpression.and(QRmaOrderDetailSn.rmaOrderDetailSn.materialCode.eq(query.getMaterialCode()));
 }
if(query.getMaterialSn()!=""&&!StringUtils.isEmpty(query.getMaterialSn())){
       booleanExpression = booleanExpression.and(QRmaOrderDetailSn.rmaOrderDetailSn.materialSn.eq(query.getMaterialSn()));
 }
if(query.getSupplierSn()!=""&&!StringUtils.isEmpty(query.getSupplierSn())){
       booleanExpression = booleanExpression.and(QRmaOrderDetailSn.rmaOrderDetailSn.supplierSn.eq(query.getSupplierSn()));
 }
 booleanExpression = booleanExpression.and(QRmaOrderDetailSn.rmaOrderDetailSn.rmaOrderDetail.rmaOrder.receiveGoodsStatus.eq(Boolean.TRUE));
 booleanExpression = booleanExpression.and(QRmaOrderDetailSn.rmaOrderDetailSn.rmaOrderDetail.rmaOrder.supplierCode.eq(query.getSupplierCode()));
 booleanExpression = booleanExpression.and(QRmaOrderDetailSn.rmaOrderDetailSn.rmaOrderDetail.rmaOrder.branchId.eq(query.getBranchId()));

 if(!StringUtils.isEmpty(query.getLegalPersonCode())){
       booleanExpression = booleanExpression.and(QRmaOrderDetailSn.rmaOrderDetailSn.rmaOrderDetail.rmaOrder.legalPersonCode.eq(query.getLegalPersonCode()));
 }
 booleanExpression = booleanExpression.and(QRmaOrderDetailSn.rmaOrderDetailSn.hasReturnFlag.eq(Boolean.FALSE));
 booleanExpression = booleanExpression.and(QRmaOrderDetailSn.rmaOrderDetailSn.putInStorageSnFlag.eq(Boolean.FALSE));
 return this.findAll(booleanExpression, pageRequest);
 }
service层

Page<RmaOrderDetailSn> snPage = rmaOrderDetailSnRepository.queryPageByOrderCodeInfo(query, new PageRequest(query.getPageIndex() - 1, query.getPageSize(), new Sort(Sort.Direction.DESC, "id")));

Resource层

AllRecords<RmaOrderDetailSn> allRecords = new AllRecords();
allRecords.build(tempList,query);
封装的返回方法
public void build (Page<T> result, PageVO query) {
    this.totalNumber = result.getTotalElements();//总elements
 this.pageSize = query.getPageSize();//每页多少elements
 this.pageIndex = query.getPageIndex();//当前页数,第一页是0
 this.totalPage = result.getTotalPages();//总页数
 this.dataList = result.getContent();//内容
}
四、常用代码(不分页,返回集合在service层)

BooleanExpression last = Expressions.asBoolean(true).isTrue();
last = last.and(QRmaReturnDetailSn.rmaReturnDetailSn.rmaReturnDetail.rmaReturn.status.ne(RmaReturnStatusEnum.cancel.getStatus()));
last = last.and(QRmaReturnDetailSn.rmaReturnDetailSn.rmaReturnDetail.rmaReturn.supplierCode.eq(query.getSupplierCode()));
last = last.and(QRmaReturnDetailSn.rmaReturnDetailSn.rmaReturnDetail.rmaReturn.branchId.eq(query.getBranchId()));
List<RmaReturnDetailSn> rmaReturnDetailSns = IterableUtils.toList(rmaReturnDetailSnRepository.findAll(last));
return rmaReturnDetailSns;
备注:
1.如果需要模糊查询
booleanExpression = booleanExpression.and(QRepairOrder.repairOrder.createUserName.like("%"+query.getCreateUserName()+"%"));
2.复杂条件
booleanExpression = booleanExpression.and(QRmaReturnDetailSn.rmaReturnDetailSn.rmaReturnDetail.rmaReturn.status.
        in(RmaReturnStatusEnum.submit.getStatus(),RmaReturnStatusEnum.auditor.getStatus(),RmaReturnStatusEnum.complete.getStatus()));
3.排序 可以传入多个值,
public Sort(Sort.Direction direction, String... properties) {
    this(direction, (List)(properties == null ? new ArrayList() : Arrays.asList(properties)));
}
4.手工分页方法(如果实在没法用以上分页,可以采用下边手工分页)
调用方
AllRecords<RepairOrderDetatilTemp> allRecords = new AllRecords();
allRecords.pageUtil (query.getPageIndex(), query.getPageSize(), tempList);

封装的方法
public void pageUtil (Integer pageIndex, Integer pageSize, List<T> list) {
    int length = list.size();
 List<T> list1 = list.stream().skip((pageIndex - 1) * pageSize).limit(pageSize).collect(Collectors.toList());
 this.totalNumber = length;//总elements
 this.pageSize = pageSize;//每页多少elements
 this.pageIndex = pageIndex;//当前页数,第一页是0
 this.totalPage = (length - 1) / pageSize + 1;//总页数
 this.dataList = list1;//内容
}
 

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

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

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

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>${maven.compiler.version}</version>
    <configuration>
        <source>${java.version}</source>
        <target>${java.version}</target>
    </configuration>
    <useIncrementalCompilation>fasle</useIncrementalCompilation>
</plugin>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

javafanwk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值