现在有销售记录表实体sale如下
public class Sale{
//销售主键
@TableId(value = "id", type = IdType.*AUTO*)
private Long id;
//品牌主键
private Long brandId;
//技师主键
private Long artificerId;
//型号主键
private Long modelId;
//车辆编号
private String vehicleNumber;
//电动机编号
private String motorNumber;
//发票号
private String invoiceNumber;
//合格证编号
private String certificateNumber;
//客户电话
private String customMobile;
//客户名称
private String customName;
//销售日期
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date saleDate;
// 逻辑删除,0-未删除,1-已删除
@TableLogic(value = "0", delval = "1")
private Integer delFlag;
//创建时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createdTime;
@TableField(exist = false)
private String artificerName;
@TableField(exist = false)
private String brandName;
@TableField(exist = false)
private String modeName;
@TableField(exist = false)
private List<Upkeep> upkeepList;
@TableField(exist = false)
private String dealerName;
}
需要用mybatis-plus作为orm框架去做查询。
要求如下:
根据技师主键和传入的起止时间startTime ,endTime查询并且根据品牌主键分组查询,需要的结果:
品牌主键brandId,统计数量count
按照以下方式使用 Mybatis-Plus 对 Sale 表进行查询:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
public class SaleService {
@Autowired
private SaleMapper saleMapper;
public List<Map<String, Object>> querySaleCountByArtificerAndBrand(Long artificerId,Date startTime,Date endTime) {
QueryWrapper<Sale> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("artificer_id", artificerId)
.between("sale_date", startTime, endTime) // 时间范围查询
.eq("del_flag", 0) // 未删除的数据
.groupBy("brand_id") // 根据品牌主键分组
.select("brand_id") // 选择需要返回的字段
.select("count(*) as count"); // 统计数量
List<Map<String, Object>> result =
saleMapper.selectMaps(queryWrapper);
return result;
}
}
以上示例中使用到了 Mybatis-Plus 中的 QueryWrapper
。通过调用eq
、between
、groupBy
等多个方法,指定了查询条件,并按照品牌主键进行分组。最后使用 selectMaps
方法获取查询结果并返回。在返回的结果中,每个 Map 对象包含品牌主键 brandId 和对应的Sale数量 count。
请注意应根据实际情况选择合适的时间格式、Mapper对象等。
QueryWrapper<Sale> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("artificer_id", artificerId) .between("sale_date", startTime, endTime) // 时间范围查询
.eq("del_flag", 0) // 未删除的据
.groupBy("brand_id") // 根据品牌主键分组
.select("brand_id,count(*) as count"); // 统计数量 return saleMapper.selectMaps(queryWrapper);
这段代码查询不出结果,分析问题所在
这个错误是因为在前端传入日期类型的参数时,Spring MVC 默认将其解析为字符串类型,而在 Controller 方法参数上通过 @RequestParam
注解声明的参数类型为 Date
类型。因此,需要在 @RequestParam
注解中指定日期的格式,使 Spring MVC 能够正确地将字符串类型的日期参数转换为 Date
类型的参数。示例代码如下:
@GetMapping("/count")
public List<Map<String, Object>> countSalesByBrandAndArtificerAndDate(
@RequestParam Long artificerId,
@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date startTime,
@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date endTime
) {
return saleService.countSalesByBrandAndArtificerAndDate(artificerId, startTime, endTime);
}
在上例中,我们在 @RequestParam
注解中使用了 @DateTimeFormat(pattern = "yyyy-MM-dd")
指定了日期格式为 yyyy-MM-dd
。这样,Spring MVC 会在解析参数时将其转换为 Date 类型,从而避免了类型转换异常。
需要注意的是,在 @DateTimeFormat
注解中指定的日期格式需要和前端传入的日期字符串格式保持一致。
问题解决!