SpringBoot中: Incorrect result size: expected 1, actual 0以及column xxxx not found解决
利用springboot + 数据库来获取学生集合的时候,却发生了报错:column academy not found的错误,对应的代码是这样的:StudentMapper类:public class StudentMapper implements RowMapper<Student> {@Overridepublic Student mapRow(ResultSet rs, in
利用springboot + 数据库来获取学生集合的时候,却发生了报错:column academy not found
的错误,对应的代码是这样的:
StudentMapper类:
public class StudentMapper implements RowMapper<Student> {
@Override
public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
Integer id = rs.getInt("id");
String stu_id = rs.getString("stu_id");
String name = rs.getString("name");
Date birth = rs.getDate("birth");
String gender = rs.getString("gender");
String phone = rs.getString("phone");
String address =rs.getString("address");
String academy = rs.getString("academy");
String grade = rs.getString("grade");
String major = rs.getString("major");
String class_name = rs.getString("class_name");
String password = rs.getString("password");
Student student = new Student(id,stu_id,name,gender,phone,address,academy,grade,major,class_name,password);
student.setBirth(birth);
return student;
}
}
而对应的数据库中的各列的名字:
而利用jdbcTemplate调用query方法的对应代码如下:
@PostMapping("/user/login")
public String login(@RequestParam()String username,
@RequestParam()String password,
@RequestParam()String identity,
Model model) {
String sql = "select * from " + identity + " where name = ?";
Student student = jdbcTemplate.queryForObject(sql,new Object[]{username},new StudentMapper());
System.out.println(student);
return "dashboard";
}
但是发生了报错,提示Incorrect result size: expected 1, actual 0 ,提示本应该希望有一个结果,但是实际商只有0个结果,那么这时候我们来看一下数据库中identity这个表中是否含有多个name相同的,如果当前的name对应的值username存在多个,那么调用queryForObject()当然会发生报错,因为queryForObject()返回的是单行的数据,也就是应给Student对象,所以针对这种情况,可以调用query进行解决。
但是如果当前的username在表中是唯一的,那么需要考虑是否使用的数据库是否正确,需要看一下配置文件properties或者yaml文件中的url中使用的数据库是否为自己想要使用的,通过观察发现,我需要使用的是db3这个数据库,但是这里使用的是db1这个数据库,而在db1这个数据库中同样存在着一个同名的identity的表,从而发生了报错:
url: jdbc:mysql://localhost:3306/db1?serverTimezone=UTC&characterEncoding=utf-8&useUnicode=true
所以需要将db1修改成为db3就可以成功了:
url: jdbc:mysql://localhost:3306/db3?serverTimezone=UTC&characterEncoding=utf-8&useUnicode=true
但是即使将上面代码修改之后,如果我们输入的是当前数据库中对应的表不存在的用户名的时候,同样会发生这样的错误:Incorrect result size: expected 1, actual 0,那么我们需要利用一个try-catch来进行判断:
String sql = "select * from " + identity + " where name = ?";
try{
Student student = jdbcTemplate.queryForObject(sql,new Object[]{username},new StudentMapper());
if(!password.equals(student.getPassword())){
model.addAttribute("msg","用户密码错误");
return "login";
}else{
return "dashboard";
}
}catch (EmptyResultDataAccessException e){
//学生为null,说明查无此人
model.addAttribute("msg","查无此人,请重新输入");
return "login";
}
但是在运行的时候,同样发生了column xxx not found的错误,而且所写的列名和数据库中的相同,那么可能会存在一下几种情况,可以参考一下这个博客:https://yichun.blog.csdn.net/article/details/91944052?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link
但是并没有解决我的问题,因为sql语句中并没有使用别名,并且实体类中含有的变量和表的变量一样,那么这时候因为解决StudentMapper这个类中rs.getString(“xxx”)中xxx not found的错误呢?
我们可以试着在rs.getString()中的参数使用column对应的下标(从1开始算的):所以修改后的StudentMapper类如下:
public class StudentMapper implements RowMapper<Student> {
@Override
public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
//值得注意的是,下标是从1开始算起的,所以如果rs.getId(0)的话,就会发生报错.
Integer id = rs.getInt(1);
String stu_id = rs.getString(2);
String name = rs.getString(3);
Date birth = rs.getDate(4);
String gender = rs.getString(5);
String phone = rs.getString(6);
String address =rs.getString(7);
String academy = rs.getString(8);
String grade = rs.getString(9);
String major = rs.getString(10);
String class_name = rs.getString(11);
String password = rs.getString(12);
Student student = new Student(id,stu_id,name,gender,phone,address,academy,grade,major,class_name,password);
student.setBirth(birth);
return student;
}
}
更多推荐
所有评论(0)