接到一个做工厂项目的需求,在做完mes系统的功能模块后,被安排做一个将数据同步到数据工厂系统然后图表展示的功能,由于以前的数据同步我都是多是用的ETL工具kettle等,这次是因为数据工厂项目要求有数据同步功能,能够在其页面写入自定义SQL,后端根据自定义SQL获取数据集,并将数据集插入到数据工厂的目标表;
前端页面配置数据库连接参数、操作的表、自定义SQL参数等保存到数据库的同步任务表,等定时任务或手动触发任务时,使用这些参数信息获取数据集,然后插入到数据工厂的新建的目标表;
前端页面:
触发了同步任务的时候,后端调用的方法:
同步方法sync调用的执行SQL语句的executeQuery方法(本文要记录的踩坑点便是在此方法中)
将结果集插入目标库的方法
完成了代码后,测试时用类似于一下的SQL是正常的
select
tableName1.`字段1`, tableName1.`字段2`, tableName1.`字段3`, tableName1.`字段4`, tableName1.`字段5`
from tableName1
left join tableName2 on tableName1.`字段1` = tableName2.`字段1`
但是,等到写实际业务要求下的SQL时,代码报错了,插入失败,找不到这个字段???
查询数据集的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,并下断点,获取到数据集时才发现,王德发,这个字段名怎么回事?
明明已经取别名了,怎么会还是原来的名字呢???
作为一名面向搜索引擎的CV工程师,百度一下,原来是因为 ResultSetMetaData
提供的是关于结果集元数据的信息,而这些信息通常是基于数据库表结构的,而不是基于查询的具体实现细节。具体来说,getColumnName
方法返回的是数据库中定义的列名,而不是查询中使用的别名;
原来如此,ResultSetMetaData
这个类的获取列名还区分原始名称和别名两个方法;既然如此,如果我的SQL代码中字段不给别名,然后又使用getColumnLabel
这样的话能取到字段名吗?
我立马把SQL修改试了一下
结果是取的是原始名。。。
这样的话 getColumnName
方法的作用是啥或者说这个方法还有必要存在吗?不论什么情况都用 getColumnLabel
不就好了吗?