文章目录
- 1. 复现错误
- 2. 分析错误
- 3. 解决错误
- 4. 文末总结
1. 复现错误
今天写好导入hive表的详情列表
的接口,如下代码所示:
/**
* hive表导入的回调接口
*
* @author super先生
* @datetime 2023/3/20:16:32
* @return
*/
@ResponseBody
@GetMapping(value = "/xxx/importTables/detail")
public ServiceStatusData localHiveImportTablesDetail(
@RequestParam("datasetId") Long datasetId) {
logger.info("mock数据的入参记录:datasetId={}", datasetId);
if (null == datasetId) {
return new ServiceStatusData(ServiceStatusData.Status.Fail, "入参错误:缺少任务id", null);
}
return hiveImportTaskService.localHiveImportTablesDetail(datasetId);
}
启动postman
访问该接口,确报出如下错误:
即Error attempting to get column 'missionId' from result set. Cause: java.sql.SQLDataException: Cannot determine value type from string 'missionMockId'\n; SQL []; Cannot determine value type from string 'missionMockId'; nested exception is java.sql.SQLDataException: Cannot determine value type from string 'missionMockId'
2. 分析错误
根据java.sql.SQLDataException
可知,这是sql数据
的错误异常。
其次,再将错误信息Error attempting to get column 'missionId' from result set
,翻译成中文是尝试从结果集中获取列“missionId”时出错
。
为什么尝试从结果集中获取列“missionId”
时出错呢?继续分析错误信息。
接着将错误信息Cannot determine value type from string 'missionMockId'
,翻译成中文是无法从字符串“missionMockId”确定值类型
。
为什么无法确定missionMockId
值类型呢?在Navicat
中执行hiveImportTaskMapper.xml
中的sql
语句,如下代码所示:
<select id="listByDatasetId" parameterType="java.lang.Long" resultType="com.xxx.HiveTableDetailVo">
SELECT
hit.id AS id,
du.user_name AS username,
hit.user_id AS userId,
hit.dataset_id AS datasetId,
hit.mission_id AS missionId,
hit.mission_state AS missionState,
date_format( hit.create_time, '%Y-%m-%d %H:%I:%s' ) AS createTime,
date_format( hit.call_back_time, '%Y-%m-%d %H:%I:%s' ) AS callbackTime,
hit.import_result AS remark
FROM
hive_import_task hit
LEFT JOIN `user` du ON du.user_id = hit.user_id
WHERE
dataset_id = #{datasetId}
order by hit.create_time desc
</select>
将上述代码中的#{datasetId}
替换成实际值2
后,执行结果如下图所示:
从上图中,可以很清楚地看到missionId
的值为missionMockId
,这是字符串类型的。
接着分析hiveImportTaskMapper.xml
中的select
标签中的返回类型(resultType
),即是HiveTableDetailVo
类:
类HiveTableDetailVo
代码如下所示:
/**
* @author super先生
* @datetime 2023/3/23 14:21
* @desc 导入hive表的详情列表
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class HiveTableDetailVo {
private Long id;
private String username;
private Long userId;
private Long datasetId;
private Long missionId;
private String missionState;
private String createTime;
private String callbackTime;
private String remark;
}
从HiveTableDetailVo
类中,可以清晰地看到missionId
的类型是Long
,而mysql
查询出的missionId
值为missionMockId
,即字符串类型。
总结错误原因为:HiveTableDetailVo
类中定义missionId
的类型和mysql
查询出的missionId
值类型不一致,故而sql
报出无法确定missionId
值类型。
3. 解决错误
既然HiveTableDetailVo
类中定义missionId
的类型和mysql
查询出的missionId
值类型不一致,那就修改?HiveTableDetailVo
类中定义missionId
的类型为String
,如下代码所示:
/**
* @author super先生
* @datetime 2023/3/23 14:21
* @desc 导入hive表的详情列表
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class HiveTableDetailVo {
private Long id;
private String username;
private Long userId;
private Long datasetId;
private String missionId;
private String missionState;
private String createTime;
private String callbackTime;
private String remark;
}
重新启动项目,再次使用postman
测试,方可成功运行,如下图所示:
4. 文末总结
通过Error attempting to get column 'missionId' from result set. Cause: java.sql.SQLDataException: Cannot determine value type from string 'missionMockId'
错误的分析与解决可知,一般报出类似错误的原因如下:
实体类的属性类型同mysql
查询出来的值类型不一致导致的。
解决方法就是修改实体类的属性类型,来适配mysql查询出来的值类型。