1.界面报错:请求参数类型不匹配,参数[id]要求类型为:'java.lang.Long',但输入值为:'undefined'
为所有domain中的(bo.vo)表添加,
/**
* ID
*/
@NotNull(message = "ID不能为空", groups = { EditGroup.class })
@Null(message = "新增时不需要ID", groups = { AddGroup.class })
private Long id; // ✅ 必须要有这个字段
2.@ExcelProperty(value = "备注")作用
EasyExcel 框架中的注解,用于 Excel导入导出时的字段映射。
3.startPage(); 在 若依Plus中已经被新的分页方式取代,不需要手动调用了
4.@TableField(exist = false) 是 MyBatis-Plus的注解,用于标记字段不是数据库表的列。
5.Wrapper 是 MyBatis-Plus 的核心查询构造器,用于动态构建 SQL 查询条件
/**
* 分页查询区域列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 区域分页列表
*/
@Override
public TableDataInfo<RegionVo> queryPageList(RegionBo bo, PageQuery pageQuery) {
log.info("查询区域列表,参数:{}, 分页:{}", bo, pageQuery);
// 1. 构建查询条件
LambdaQueryWrapper<Region> wrapper = buildQueryWrapper(bo);
// 2. 执行分页查询
Page<Region> page = baseMapper.selectPage(pageQuery.build(), wrapper);
log.info("查询到 {} 条记录,总条数:{}", page.getRecords().size(), page.getTotal());
// 3. 转换为VO
List<RegionVo> vos = MapstructUtils.convert(page.getRecords(), RegionVo.class);
// 4. 如果有数据,填充点位数量
if (!vos.isEmpty()) {
fillNodeCount(vos);
}
// 5. 创建返回结果
Page<RegionVo> voPage = new Page<>();
voPage.setRecords(vos);
voPage.setTotal(page.getTotal());
voPage.setSize(page.getSize());
voPage.setCurrent(page.getCurrent());
return TableDataInfo.build(voPage);
}
/**
* 填充点位数量
*/
private void fillNodeCount(List<RegionVo> vos) {
List<Long> regionIds = vos.stream()
.map(RegionVo::getId)
.collect(Collectors.toList());
if (!regionIds.isEmpty()) {
try {
// 批量查询统计
List<Map<String, Object>> stats = nodeMapper.selectNodeStatsByRegionIds(regionIds);
log.info("查询到 {} 个区域的统计信息", stats.size());
// 构建映射
Map<Long, Integer> countMap = stats.stream()
.collect(Collectors.toMap(
map -> ((Number) map.get("region_id")).longValue(),
map -> ((Number) map.get("node_count")).intValue()
));
// 填充数据
vos.forEach(vo -> {
Integer count = countMap.get(vo.getId());
vo.setNodeCount(count != null ? count : 0);
log.debug("区域 {} 的点位数量:{}", vo.getId(), vo.getNodeCount());
});
} catch (Exception e) {
log.error("查询点位统计信息失败", e);
// 如果查询失败,设置默认值0
vos.forEach(vo -> vo.setNodeCount(0));
}
}
}
NodeMapper中:
@Select("<script>" +
"SELECT region_id, COUNT(*) as node_count " +
"FROM tb_node " +
"WHERE del_flag = '0' " +
"AND region_id IN " +
"<foreach collection='regionIds' item='id' open='(' separator=',' close=')'>" +
"#{id}" +
"</foreach>" +
"GROUP BY region_id" +
"</script>")
List<Map<String, Object>> selectNodeStatsByRegionIds(@Param("regionIds") List<Long> regionIds);
6.继承若依plus的entity基类通常有三个字段需要添加:
ALTER TABLE `tb_emp` ADD COLUMN `create_by` varchar(64) DEFAULT '' COMMENT '创建者', ADD COLUMN `update_by` varchar(64) DEFAULT '' COMMENT '更新者', ADD COLUMN `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0正常 1删除)';
还有创建部门,更新时间,修改时间;都是继承若依plus基类的必须字段(不建议修改基类,需要改一大堆!!!
7.
import jakarta.validation.constraints.*;
这个导入用于在实体类、DTO等Java Bean上添加声明式验证注解,让框架自动验证数据的合法性。
8.
5678

被折叠的 条评论
为什么被折叠?



