记一次ResultSetMetaData类的getColumnName方法使用踩坑记录

时间:2024-11-15 17:55:54


接到一个做工厂项目的需求,在做完mes系统的功能模块后,被安排做一个将数据同步到数据工厂系统然后图表展示的功能,由于以前的数据同步我都是多是用的ETL工具kettle等,这次是因为数据工厂项目要求有数据同步功能,能够在其页面写入自定义SQL,后端根据自定义SQL获取数据集,并将数据集插入到数据工厂的目标表;

前端页面配置数据库连接参数、操作的表、自定义SQL参数等保存到数据库的同步任务表,等定时任务或手动触发任务时,使用这些参数信息获取数据集,然后插入到数据工厂的新建的目标表;

前端页面:

记一次ResultSetMetaData类的getColumnName方法使用踩坑记录_数据

触发了同步任务的时候,后端调用的方法:

记一次ResultSetMetaData类的getColumnName方法使用踩坑记录_数据_02

记一次ResultSetMetaData类的getColumnName方法使用踩坑记录_SQL_03

记一次ResultSetMetaData类的getColumnName方法使用踩坑记录_数据_04

记一次ResultSetMetaData类的getColumnName方法使用踩坑记录_SQL_05

同步方法sync调用的执行SQL语句的executeQuery方法(本文要记录的踩坑点便是在此方法中)

记一次ResultSetMetaData类的getColumnName方法使用踩坑记录_SQL_06

将结果集插入目标库的方法

记一次ResultSetMetaData类的getColumnName方法使用踩坑记录_SQL_07

记一次ResultSetMetaData类的getColumnName方法使用踩坑记录_字段_08

记一次ResultSetMetaData类的getColumnName方法使用踩坑记录_数据_09

完成了代码后,测试时用类似于一下的SQL是正常的

select 
tableName1.`字段1`, tableName1.`字段2`, tableName1.`字段3`, tableName1.`字段4`, tableName1.`字段5`
from tableName1
left join tableName2 on tableName1.`字段1` = tableName2.`字段1`

但是,等到写实际业务要求下的SQL时,代码报错了,插入失败,找不到这个字段???

记一次ResultSetMetaData类的getColumnName方法使用踩坑记录_字段_10

查询数据集的SQL代码:

WITH `feedback_t` AS (
	SELECT
		`mes_pro_feedback`.`workorder_id` AS `workorder_id`,
		cast( `mes_pro_feedback`.`feedback_time` AS date ) AS `feedback_time`,
		sum( `mes_pro_feedback`.`quantity_feedback` ) AS `feedback_qty`,
		count( 1 ) AS `feedback_count` 
	FROM
		`mes_pro_feedback` 
	WHERE
		( `mes_pro_feedback`.`status` = 'FINISHED' ) 
	GROUP BY
		`mes_pro_feedback`.`workorder_id`,
		cast( `mes_pro_feedback`.`feedback_time` AS date ) 
	ORDER BY
		`mes_pro_feedback`.`workorder_id`,
		`feedback_time` 
	) SELECT
	`t0`.`workorder_id` AS `workorder_id`,
	`t0`.`workorder_code` AS `workorder_code`,
	`t0`.`workorder_name` AS `workorder_name`,
	`t0`.`create_time` AS `create_time`,
	`t0`.`request_date` AS `request_date`,
	`t0`.`quantity` AS `wordorder_qty`,
	sum( `t1`.`feedback_qty` ) AS `produced_qty`,
	sum( `t1`.`feedback_count` ) AS `total_feedback_count`,
	json_arrayagg(
	json_object( 'feedback_date', date_format( `t1`.`feedback_time`, '%m-%d' ), 'feedback_qty', `t1`.`feedback_qty`, 'feedback_count', `t1`.`feedback_count` )) AS `feedback_records` 
FROM
	(
		`mes_pro_workorder` `t0`
		LEFT JOIN `feedback_t` `t1` ON ((
				`t0`.`workorder_id` = `t1`.`workorder_id` 
			))) 
WHERE
	( `t0`.`status` = 'FINISHED' ) 
GROUP BY
	`t0`.`workorder_id`,
	`t0`.`workorder_code`,
	`t0`.`workorder_name`,
	`t0`.`quantity`,
	`t0`.`create_time`,
	`t0`.`request_date` 
ORDER BY
	`t0`.`create_time` DESC LIMIT 0,500 LIMIT 0,500

一开始,还以为是查询SQL写错了,然而,当我检查了SQL,并下断点,获取到数据集时才发现,王德发,这个字段名怎么回事?

记一次ResultSetMetaData类的getColumnName方法使用踩坑记录_字段_11

明明已经取别名了,怎么会还是原来的名字呢???

记一次ResultSetMetaData类的getColumnName方法使用踩坑记录_字段_12

作为一名面向搜索引擎的CV工程师,百度一下,原来是因为 ResultSetMetaData 提供的是关于结果集元数据的信息,而这些信息通常是基于数据库表结构的,而不是基于查询的具体实现细节。具体来说,getColumnName 方法返回的是数据库中定义的列名,而不是查询中使用的别名;

原来如此,ResultSetMetaData  这个类的获取列名还区分原始名称和别名两个方法;既然如此,如果我的SQL代码中字段不给别名,然后又使用getColumnLabel 这样的话能取到字段名吗?

我立马把SQL修改试了一下

记一次ResultSetMetaData类的getColumnName方法使用踩坑记录_SQL_13

结果是取的是原始名。。。

记一次ResultSetMetaData类的getColumnName方法使用踩坑记录_字段_14

这样的话 getColumnName 方法的作用是啥或者说这个方法还有必要存在吗?不论什么情况都用 getColumnLabel 不就好了吗?