当我们进行分页查询时,如果设计到多张表,那么就需要多表连查。
比如说,页面需要展示的参数有"属性ID"和"属性值",那么这就需要查询多张表。然后将查询到的结果以一个实体类的方式返回给前端。很明显这个实体类对象就是属性实体类ProdProp,但是这个属性实体类只有属性ID,没有属性值这个参数,属性值需要查询其他的表才可以获得。
那么,我在给前端返回对象时候,该返回什么对象呢?
如果返回一个ProdProp对象,少了一个属性值参数啊。
这个时候就需要使用注解,使用注解补充缺少的参数后,就可以返回对象给前端了。
@TableField(exist = false)
private List<ProdPropValue> prodPropValues;
完整的ProdProp实体类
package com.powernode.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
@ApiModel(value="com-powernode-domain-ProdProp")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "prod_prop")
public class ProdProp implements Serializable {
/**
* 属性id
*/
@TableId(value = "prop_id", type = IdType.AUTO)
@ApiModelProperty(value="属性id")
private Long propId;
/**
* 属性名称
*/
@TableField(value = "prop_name")
@ApiModelProperty(value="属性名称")
private String propName;
/**
* ProdPropRule 1:销售属性(规格); 2:参数属性;
*/
@TableField(value = "rule")
@ApiModelProperty(value="ProdPropRule 1:销售属性(规格); 2:参数属性;")
private Integer rule;
/**
* 店铺id
*/
@TableField(value = "shop_id")
@ApiModelProperty(value="店铺id")
private Long shopId;
/////////////// 多条件分页查询 //////////////////////
@TableField(exist = false)
@ApiModelProperty("属性值集合")
private List<ProdPropValue> prodPropValues;
private static final long serialVersionUID = 1L;
}
ProdPropController
/**
* 多条件分页查询商品
* @param current 页码
* @param size 每页显示条数
* @param prodName 商品名称
* @param status 商品状态
* @return
*/
@ApiOperation("多条件分页查询商品")
@GetMapping("page")
@PreAuthorize("hasAuthority('prod:prod:page')")
public Result<Page<Prod>> loadProdPage(@RequestParam Long current,
@RequestParam Long size,
@RequestParam(required = false) String prodName,
@RequestParam(required = false) Long status) {
// 创建商品分页对象
Page<Prod> page = new Page<>(current,size);
// 多条件分页查询商品
page = prodService.page(page,new LambdaQueryWrapper<Prod>()
.eq(ObjectUtil.isNotNull(status),Prod::getStatus,status)
.like(StringUtils.hasText(prodName),Prod::getProdName,prodName)
.orderByDesc(Prod::getCreateTime)
);
return Result.success(page);
}
ProdPropServiceImpl
@Override
public Page<ProdProp> queryProdSpecPage(Long current, Long size, String propName) {
// 创建分页对象
Page<ProdProp> page = new Page<>(current,size);
// 多条件分页查询商品属性
page = prodPropMapper.selectPage(page,new LambdaQueryWrapper<ProdProp>()
.like(StringUtils.hasText(propName),ProdProp::getPropName,propName)
);
// 从分页对象中获取属性记录
List<ProdProp> prodPropList = page.getRecords();
// 判断是否有值
if (CollectionUtil.isEmpty(prodPropList) || prodPropList.size() == 0) {
// 如果属性对象集合没有值,说明属性值也为空
return page;
}
// 从属性对象集合中获取属性id集合
List<Long> propIdList = prodPropList.stream().map(ProdProp::getPropId).collect(Collectors.toList());
// 属性id集合查询属性值对象集合
List<ProdPropValue> prodPropValueList = prodPropValueMapper.selectList(new LambdaQueryWrapper<ProdPropValue>()
.in(ProdPropValue::getPropId, propIdList)
);
//下面这种写法比较常见,避免了去数据库进行多表查询,提高了效率
// 循环遍历属性对象集合
prodPropList.forEach(prodProp -> {
// 从属性值对象集合中过滤出与当前属性对象的属性id一致的属性对象集合
List<ProdPropValue> propValues = prodPropValueList.stream()
.filter(prodPropValue -> prodPropValue.getPropId().equals(prodProp.getPropId()))
.collect(Collectors.toList());
prodProp.setProdPropValues(propValues);
});
return page;
}