问题
假设
基础查询类:BaseQuery.java@Setter
@Getter
@SuperBuilder // ----------------1
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class BaseQuery {
/**
* 页码
*/
@ApiModelProperty(value = "页码")
private Integer pageNum;
/**
* 页面大小
*/
@ApiModelProperty(value = "页面大小")
private Integer pageSize;
/**
* 查询关键字
*/
@ApiModelProperty(value = "查询关键字")
private String keywords;
/**
* 状态:1可用 2不可用
*/
@ApiModelProperty(value = "状态 1上架 2下架")
private Integer status;
/**
* 起止时间的类型 1创建时间(默认) 2修改时间
*/
@ApiModelProperty(value = "起止时间的类型 1创建时间(默认) 2修改时间")
private Integer dateType;
/**
* 开始时间
*/
@ApiModelProperty(value = "开始时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") //返回时间类型
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") //接收时间类型
private LocalDateTime startTime;
/**
* 结束时间
*/
@ApiModelProperty(value = "结束时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") //返回时间类型
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") //接收时间类型
private LocalDateTime endTime;
public Integer getPageNum() {
return pageNum == null ? WeGoConst.PAGE_NUM : pageNum;
}
public Integer getPageSize() {
return pageSize == null ? WeGoConst.PAGE_SIZE : pageSize;
}
}
具体的查询类:SpuQuery.java
@ApiModel(value = "com-wego-domain-query-SpuQuery")
@Getter
@Setter
@SuperBuilder //----------2
@ToString(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
public class SpuQuery extends BaseQuery {
/**
* 类别id的集合:1,2,33,4,5,67
*/
private String cids;
}
具体查询方法:
public PageBean getPage(SpuQuery spuQuery) {
//分页
Page page = new Page(spuQuery.getPageNum(), spuQuery.getPageSize());
//查询条件
QueryWrapper queryWrapper = new QueryWrapper();
//动态构造条件查询时的查询条件
Integer status = baseQuery.getStatus();
if (status != null) {
queryWrapper.eq("status", status);
}
Integer dateType = spuQuery.getDateType();
LocalDateTime startTime = spuQuery.getStartTime();
LocalDateTime endTime = spuQuery.getEndTime();
if (dateType != null) {
if (startTime != null && endTime != null) {
//默认为创建时间
queryWrapper.between("create_time", startTime.toString(), endTime.toString());
} else{
queryWrapper.between("update_time", startTime.toString(), endTime.toString());
}
}
String keywords = spuQuery.getKeywords();
if (StringUtils.hasText(keywords)) {
queryWrapper.like("name", keywords)
.or().like("info", keywords);
}
String cids = spuQuery.getCids();
//如果pid为null则查询所有的顶级类别,否则查询相应的子类别
if (cids != null) {
queryWrapper.in("category_id", Arrays.asList(cids.split(",")));
}
//排序:默认按显示优先级降序排序,优先级相同按添加时间降序排序
queryWrapper.orderByAsc("priority").orderByDesc("id").orderByDesc("sales_amount").orderByDesc("recommends");
page(page, queryWrapper);
//将MybatisPlus的Page对象转换成自定义的PageBean对象
PageBean pageBean = PageBean.init(page);
return pageBean;
}
测试:
@SpringBootTest
class SpuServiceImplTest {
@Resource
private SpuService spuService;
@Test
void getPage() {
SpuQuery spuQuery = SpuQuery.builder()
.cids("11,14,16")
.keywords("a")
.build();
spuService.getPage(spuQuery);
}
}
运行程序,出错。 问题应该是MyBatisPlus和Lombok不兼容。
解决方案 第一步:去除 BaseQuery中注解1处的@SuperBuilder代码 第二步;修改SpuQuery代码如下所示:@Getter
@Setter
@ToString(callSuper = true)
@NoArgsConstructor
public class SpuQuery extends BaseQuery {
/**
* 类别id的集合:1,2,33,4,5,67
*/
private String cids;
@Builder
public SpuQuery(String cids, Integer pageNum, Integer pageSize, String keywords, Integer status, Integer dateType, LocalDateTime startTime, LocalDateTime endTime) {
super(pageNum, pageSize, keywords, status, dateType, startTime, endTime);
this.cids = cids;
}
}
注意:这种方式弊端也很明显:
- 子类调用父类的全参构造,当父类参数数量、顺序调整时,子类也需要同步调整。
- 如果父类参数过多,构造方法十分不优雅。