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字段就会被赋予不同的值。
应该放入
<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>
还没有评论,来说两句吧...