多条件分页查询-多表查询

当我们进行分页查询时,如果设计到多张表,那么就需要多表连查。

比如说,页面需要展示的参数有"属性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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值