Jdbctemplate 查询字符串:EmptyResultDataAccessException:结果大小不正确:预期 1,实际 0

spring

1个回答

写回答

Lilyaa

2025-07-09 20:44

+ 关注

Spring
Spring

JdbcTemplate是Spring框架中的一个重要组件,用于简化数据库操作。它提供了一种方便的方式来执行SQL查询,并将结果映射到Java对象中。然而,在使用JdbcTemplate进行查询时,有时会遇到EmptyResultDataAccessException异常,该异常表示查询结果大小与预期不符。

在实际开发中,我们经常需要对数据库进行查询操作,以获取所需的数据。使用JdbcTemplate可以简化这个过程,只需编写SQL语句并将其与JdbcTemplate对象关联起来即可。JdbcTemplate会负责执行SQL语句并返回结果。

然而,当我们期望查询结果为一个对象或一组对象时,有时会出现结果大小不符的情况。例如,我们期望查询一条记录,但实际上查询结果为空。这种情况下,JdbcTemplate会抛出EmptyResultDataAccessException异常,告知我们查询结果的大小与预期不符。

为了更好地理解这个问题,我们来看一个案例代码。假设我们有一个名为"students"的数据库表,其中存储了学生的信息,包括学生的姓名和年龄。我们希望通过JdbcTemplate查询某个特定学生的信息,并将其映射到一个Student对象中。

Java

public class Student {

private String name;

private int age;

// getters and setters

}

public class StudentDao {

private JdbcTemplate jdbcTemplate;

public Student findStudentByName(String name) {

String sql = "SELECT * FROM students WHERE name = ?";

try {

return jdbcTemplate.queryForObject(sql, new Object[]{name}, (rs, rowNum) -> {

Student student = new Student();

student.setName(rs.getString("name"));

student.setAge(rs.getInt("age"));

return student;

});

} catch (EmptyResultDataAccessException e) {

throw new RuntimeException("No student found with name: " + name);

}

}

}

在上述代码中,我们定义了一个Student类来表示学生信息,并在StudentDao类中编写了查询方法findStudentByName。该方法使用JdbcTemplate执行SQL查询,并将结果映射到Student对象中。如果查询结果为空,则会抛出EmptyResultDataAccessException异常。

现在,让我们来分析一下这个问题。当我们使用findStudentByName方法查询一个不存在的学生时,例如"John",我们期望的结果是抛出一个异常,告知我们没有找到该学生的信息。然而,当数据库中没有匹配的记录时,JdbcTemplate会抛出EmptyResultDataAccessException异常,提示结果大小不正确。

解决EmptyResultDataAccessException异常的方法

在处理EmptyResultDataAccessException异常时,我们可以选择不抛出异常,而是返回一个空的Optional对象或null值。这样,调用方可以根据需要进行进一步处理。

Java

public class StudentDao {

private JdbcTemplate jdbcTemplate;

public Optional<Student> findStudentByName(String name) {

String sql = "SELECT * FROM students WHERE name = ?";

try {

return Optional.ofNullable(jdbcTemplate.queryForObject(sql, new Object[]{name}, (rs, rowNum) -> {

Student student = new Student();

student.setName(rs.getString("name"));

student.setAge(rs.getInt("age"));

return student;

}));

} catch (EmptyResultDataAccessException e) {

return Optional.empty();

}

}

}

在上述修改后的代码中,我们将返回类型由Student改为Optional。如果查询结果为空,我们将返回一个空的Optional对象,否则将返回包含Student对象的Optional对象。

通过JdbcTemplate进行数据库查询时,有时会遇到EmptyResultDataAccessException异常,该异常表示查询结果大小与预期不符。在处理这个异常时,我们可以选择返回一个空的Optional对象或null值,以便调用方进行进一步处理。

在使用JdbcTemplate进行开发时,我们需要注意处理查询结果为空的情况,以避免出现EmptyResultDataAccessException异常。这样可以提高代码的健壮性和可靠性,确保我们能够正确地处理各种查询结果。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号