在开发中,我们经常使用关联查询,但是在左右关联查询时,往往会在查出数据中存在null值,该null值会导致实体类接收数据时报错。以下就该问题进行阐述及解决办法描述。
工具/原料
1
java
2
ibatis,mysql
方法/步骤
1
引用以下经验中创建的表及数据,并且在student表中添加一些数据,如下图所示,这样为外连接score查出null值做准备。
2
数据准备完成后,我们可以通过score,student两张表进行联查,查询出每个学生的总分数列表。创建实体类对数据进行接收,如下图所示。
3
利用left join左连接进行联查,sql如下。
4
运行main方法进行测试,我们发现,在接收实体类ScoreSum接收sql联查数据时,会报错,提示无法设置属性。
5
分析该报错,日志中提示setScore的时候报错,为非法值;该提示只有sql查出的score字段为null,在返回给接收实体类时,才会有该报错信息,因此,问题出现在查询返回null上面。利用sql直接在数据库中查找,如下结果,验证了该字段有null 值的猜想。
7
使用ifnull方法,将其放入进查询sql中,如下图所示进行添加。
8
再次运行sql,将该查询结果和5步骤中结果进行比较,可以看到原先的null值已经被转换成0了。
9
更换程序ibatis的mapper文件中的sql并保存。
10
通过debug模式重新运行main方法进行测试,如下为测试结果;可以看到运行完查询sql没有再报错,且查询出结果了。
11
这样就解决了SQL中使用left join关联查询存在的问题,当然如果需要将值根据条件变更多个,可以使用if()方法。
注意事项
在sql中使用if方法时,一定要注意条件值不能为0和null