我的 BeanPropertyRowMapper 无法映射一个属性

问题描述

我正在 Spring 中处理一些 DAO 文件,但我的 BeanPropertyRowMapper 存在一些问题。它正确映射了多个属性,但对于一个属性,它返回 null。为什么会发生?这是我用于读取条目的 DAO 方法

    @Override
public Optional<Activity> read(Long id) {
    try {
        return Optional.ofNullable(jdbcTemplate.queryForObject("SELECT * FROM activities WHERE id=?",new BeanPropertyRowMapper<>(Activity.class),id));
    } catch (EmptyResultDataAccessException e) {
        return Optional.empty();
    }
}

这是我的模型:

public class Activity implements Entity<Long> {
private Long id;
private Long groupId;
private Long classRoomId;
private Long lessonNumber;
private Long courseId;

public Activity() {
}

public Activity(Long id,Long groupId,Long classRoomId,Long lessonNumber,Long courseId) {
    this.id = id;
    this.groupId = groupId;
    this.classRoomId = classRoomId;
    this.lessonNumber = lessonNumber;
    this.courseId = courseId;
}

public Activity(Long groupId,Long courseId) {
    this.groupId = groupId;
    this.classRoomId = classRoomId;
    this.lessonNumber = lessonNumber;
    this.courseId = courseId;
}

public Long getGroupId() {
    return groupId;
}

public void setGroupId(Long groupId) {
    this.groupId = groupId;
}

public Long getClassRoomId() {
    return classRoomId;
}

public void setClassRoomId(Long classRoomId) {
    this.classRoomId = classRoomId;
}

public Long getLessonNumber() {
    return lessonNumber;
}

public void setLessonNumber(Long lessonNumber) {
    this.lessonNumber = lessonNumber;
}

public Long getCourseId() {
    return courseId;
}

public void setCourseId(Long courseId) {
    this.courseId = courseId;
}

@Override
public Long getId() {
    return id;
}

@Override
public void setId(Long id) {
    this.id = id;
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    Activity activity = (Activity) o;

    if (groupId != null ? !groupId.equals(activity.groupId) : activity.groupId != null) return false;
    if (classRoomId != null ? !classRoomId.equals(activity.classRoomId) : activity.classRoomId != null)
        return false;
    if (lessonNumber != null ? !lessonNumber.equals(activity.lessonNumber) : activity.lessonNumber != null)
        return false;
    return courseId != null ? courseId.equals(activity.courseId) : activity.courseId == null;
}

@Override
public int hashCode() {
    int result = groupId != null ? groupId.hashCode() : 0;
    result = 31 * result + (classRoomId != null ? classRoomId.hashCode() : 0);
    result = 31 * result + (lessonNumber != null ? lessonNumber.hashCode() : 0);
    result = 31 * result + (courseId != null ? courseId.hashCode() : 0);
    return result;
}

@Override
public String toString() {
    return String.format("id is %s,groupId is %s,classRoomId is %s,lessonNumber is %s,courseId is %s",this.id,this.groupId,this.classRoomId,this.lessonNumber,this.courseId);
}
}

这是我的 Junit 测试方法

   @Test
void read() throws Exception {
    Activity expected = new Activity(100L,100L,1L,100L);
    Long id = activityDao.save(expected).getId();
    if(activityDao.read(id).isPresent()){
        Activity actual = activityDao.read(id).get();
        assertEquals(expected,actual);
    }else {
        fail("Not found");
    }
}

这是我的 Junit 测试方法返回的内容

org.opentest4j.AssertionFailedError: 预期:id 为空,groupId 为 100,classRoom_Id 为 100,课程编号为 1,courseId 为 100 实际 :id 为 1,groupId 为 100,classRoom_Id 为 null,lessonNumber 为 1,courseId 为 100

编辑: 这是我的数据库表: enter image description here

编辑: 稍微改变了 dao 方法,以便属性和表列匹配:

@Override
public Optional<Activity> read(Long id) {
    try {
        return Optional.ofNullable(jdbcTemplate.queryForObject("SELECT a.id as id,a.group_id as groupId,a.classroom_id as classRoomId,a.lessonnumber as lessonNumber," +
                " a.course_id as courseId FROM activities a WHERE id=?",id));
    } catch (EmptyResultDataAccessException e) {
        return Optional.empty();
    }
}

然而它不起作用。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...