dao层返回接受值是List<Map>没有结果集报错Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
时间: 2025-03-24 08:13:52 浏览: 35
### 问题分析
当 DAO 层返回 `List<Map>` 类型的结果集时,如果查询未返回任何数据,则可能会触发 `java.lang.IndexOutOfBoundsException` 异常。这是因为代码尝试访问列表中的第一个元素(索引为 0),但在结果集中没有任何条目的情况下,这种操作会导致数组越界异常。
根据提供的引用内容以及常见场景,以下是可能的原因及其解决方案:
- **原因一**:SQL 查询未能匹配到任何记录,导致返回的 `List<Map>` 是空集合,在后续逻辑中试图通过索引访问其内容时抛出了异常[^1]。
- **原因二**:某些框架(如 MyBatis 或 EasyPoi)在处理复杂映射关系时可能出现不一致的行为,尤其是在构造器参数数量与 SQL 返回字段数不符的情况下[^2][^3]。
- **原因三**:分页查询可能导致 LIMIT 子句限制了返回的数据量,从而引发类似的异常[^4]。
---
### 解决方案
#### 方法一:检查并验证 SQL 查询
确保 SQL 查询能够正常运行,并且不会因为条件过滤而导致无结果的情况发生。可以通过日志打印或调试工具查看实际执行的 SQL 和传入参数。
```sql
SELECT * FROM table_name WHERE condition;
```
如果确实存在无结果的可能性,则应在业务逻辑层面增加判断机制来避免直接访问空列表的内容。
#### 方法二:增强健壮性的代码实现
在获取结果之前先校验 `List<Map>` 是否为空或者长度是否满足需求,以此防止潜在的下标越界风险。
```java
if (result != null && !result.isEmpty()) {
Map<String, Object> firstRecord = result.get(0);
// 对 firstRecord 进一步处理...
} else {
System.out.println("No records found.");
}
```
上述代码片段展示了如何安全地从 `List<Map>` 中提取首个元素。
#### 方法三:调整分页策略
对于涉及分页的操作,建议采用成熟的第三方库替代手动编写带有 LIMIT 的 SQL 语句。例如使用 MyBatis 分页插件 PageHelper 可有效规避此类问题。
```java
PageHelper.startPage(pageNum, pageSize);
List<Student> students = studentMapper.selectByIdDesc("id");
// 自动封装好的分页对象包含了总记录数等信息
PageInfo<Student> pageInfo = new PageInfo<>(students);
System.out.println(pageInfo.getList());
```
此方式不仅简化了开发流程还增强了系统的可维护性和扩展性。
#### 方法四:优化实体类设计
针对特定场景下的特殊需求(如同步导出 Excel 文件),需仔细审查相关 DTO/VO 定义是否存在不合理之处。必要时可以重构这些模型以便更好地适配现有技术栈的功能特性。
```java
@Data
public class PartnerDto {
@ExcelIgnore
private Long id;
@Excel(name = "昵称", needMerge = true)
private String name;
@Excel(name = "邮箱", needMerge = true)
private String email;
@ExcelCollection(name = "关联公司")
private List<String> companyList;
public PartnerDto(String name, String email, List<String> companyList) {
this.name = name;
this.email = email;
this.companyList = Optional.ofNullable(companyList).orElse(Collections.emptyList());
}
}
```
这里引入了 Java 8 的 `Optional` 工具类用于初始化默认值,减少因输入参数缺失引起的隐患。
---
### 总结
综上所述,解决 DAO 层返回 `List<Map>` 导致 `IndexOutOfBoundsException` 的核心在于加强前置检验措施、改进底层架构设计以及合理选用辅助组件等方面共同努力才能达到预期效果。
---
阅读全文
相关推荐


















