项目场景:
项目场景:使用MyBatis框架实现多对多关系映射
问题描述:
在运行测试代码时报以下错误:
org.apache.ibatis.exceptions.PersistenceException:
Error querying database. Cause: java.lang.NullPointerException
具体报错信息如下:
相关XML代码如下:
<resultMap type="Student" id="studentResult">
<id property="id" column="s_id"/>
<result property="name" column="s_name"/>
<result property="gender" column="s_gender"/>
<result property="age" column="s_age"/>
<collection property="courses" column="courseResult"/>
</resultMap>
<resultMap type="Course" id="courseResult">
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
</resultMap>
<select id="findAllStudents" resultMap="studentResult">
select s.id as s_id, s.name as s_name, s.gender as s_gender, s.age as s_age,
c.id as c_id, c.name as c_name
from student s, course c, stu_cou sc
where s.id = sc.s_id
and c.id = sc.c_id
</select>
相关JAVA代码如下:
@Test
public void test1() {
SqlSession session = MyBatisSqlSessionFactory.getSession();
ManyToManyMapper mapper = session.getMapper(ManyToManyMapper.class);
List<Student> students = mapper.findAllStudents();
students.forEach((stu) -> {
System.out.println(stu);
stu.getCourses().forEach((cou) -> {
System.out.println("\t" + cou);
});
});
}
原因分析:
通过调试发现相应的factory、session、mapper对象都不为空,最后从XML中寻找,发现在resultMap中的collection子元素的column属性写错了
解决方案:
将XML中的resultMap元素中的collection子元素的column属性改为resultMap属性即可。
修改后的代码如下:
<resultMap type="Student" id="studentResult">
<id property="id" column="s_id"/>
<result property="name" column="s_name"/>
<result property="gender" column="s_gender"/>
<result property="age" column="s_age"/>
<collection property="courses" resultMap="courseResult"/>
</resultMap>