Spring boot接入视图时的问题

背景:

最近以前上线的项目需要做报表汇报,所以小组长看我不是很忙就让我跟着做了,其中三小个模块内容即三个接口,第一个是直接对接第三方接口(涉及到三个),第二个是直接接入sqlserver数据库的一张表的数据,第三个是从本项目mysql的数据库的视图中查询数据,其中在接入视图时中间遇到了一些小难题,特此记录一下。

问题过程与记录:

视图接入的时候是按照接入Mysql数据库中的一张表的流程接入的,但是遇到了挺多麻烦

1.因为这个视图只有生产中有而测试环境没有,所以我先拷贝了一份生产的视图创建命令到测试环境,但是在测试环境创建视图时执行完创建命令后视图名称是小写如c_reporta3,而生产中的同样的命令视图名称实际是C_ReportA3大写。

解决:

后来发现是mysql的配置文件my.ini中的关于视图或者表名称的大小写规则配置不一样,具体的可按照show variables like 'lower_case_table_names' 查询下,值为0区分大小写,但创建时若未特殊配置,仍会自动转小写存储,值为1不区分大小写,值为2区分大小写,把命令在生产和测试环境执行生产值是2,测试mysql默认是1,所以创建的视图命令即使是大写的视图名称,在实际执行时也会转为小写。

2.在接入视图的时候把service、entity-表对应的实体、mapper、xml文件都写完之后,调接口报错报空指针,如下

解决:

我开始看的时候以为是mybatis plus底层报的错,就一直怀疑自己的mapper或者service是不是写的不对,后来小组长看完后直接跟我说实际上是我们封装的mybatis-plus-common模块报的错,这个报错其实我也看到了(实际截图中没有,但是日志中有打印),但是实际没往这方面想(当时可能也想了,去看common模块了但是因为common模块的分支不对,没有找到报错行数,就越来越急)。因为这个common模块是我另外一个同事写的小组长就直接说找他看下,后来他看了具体是在mybatisplus上加了一些拦截处理,报错是因为我的sql语句里没有where条件,算是common模块的一个bug吧,后来就在xml文件里把sql语句加了where 1=1,然后报错解决,所以大家一定不要畏惧看底层代码。。。。。。

3.查询视图接口返回table.C_ReportA3没找到,后来返回table.c_reporta3没找到

解决:

在xml文件中我的sql语句开始这样写的:select 日期1,次数 from C_ReportA3 where 1=1 order by 日期1 desc last 7;然后调接口报table.C_ReportA3没找到,后来想起来是不是因为测试环境是小写的c_reporta3视图名称,于是改成小写,然后又报c_reporta3没找到,最后在sql语句中对视图名称加了反引号`c_reporta3`,实体中的@TableName("`c_reporta3`")也改了,然后再次查询不再报这个问题,即select `日期1` ,`次数` from `c_reporta3` where 1=1 order by 日期1 desc last 7;【注意可能有的不生效还需要加上数据库名,即数据库名.视图名,数据库名可能也需要加反引号】

4.查询视图返回的字段名称均为null,注意不是字段值为null,是字段名为null,即视图中的字段没有映射到实体中

解决:

因为视图中的字段都是中文,而我创建的实体中也正确映射了中文名称,也没有多加空格或者@TableFiled中的value="中文名称"和视图中的不一致,然后改了sql直接显式确认字段名没再出现这个问题即select `日期1` as createDate,`次数`as times from `c_reporta3` where 1=1 order by 日期1 desc last 7;

5.将该视图名称加入到mybatisplus的filter-tables配置没生效

解决:

因为项目引入了mybatisplus的多租户插件,即默认所有的表在生成sql时会在where条件末尾加入and tenant_id="xx"条件,因为该视图中没有tenant_id字段所以需要把该视图过滤,于是用到了filter-tables配置,开始我在filter-tables中写的视图名是c_reporta3,然后没生效,后来改成了`c_reporta3`即加了反引号,然后生效了【注意可能有的不生效还需要加上数据库名,即数据库名.视图名,数据库名可能也需要加反引号】

6.其他-在查询视图时还报了error sql,即sql语法不正确,原因是整个sql语句换行了且在换行处我没有加+号串联成字符串,具体报错如下:"nested exception is org.apache.ibatis.exceptions.PersistenceException: \n### Error querying database. Cause: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Failed to process, Error SQL: SELECT 次数`,`日期1` FROM `c_reporta3` where 1=1 order by `日期1` desc limit 7\n### Cause: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Failed to process, Error SQL: SELECT `次数`,`日期1` FROM `c_reporta3` where 1=1 order by `日期1` desc limit 7"

后来我把sql语句改成了一行就没有这个问题了,或者改成

"select 日期1,次数 from `gs-oes`.`c_reporta3` " +

"where 1=1 " +

"order by `日期1` desc " +

"limit 7";应该也是可以的)【当然后来把sql中的数据库名去掉了】,就没再报这个问题了

本人是菜鸡。。。。。。。。。

相关推荐
这个DBA有点耶7 小时前
从MySQL 5.7到8.0:JSON查询性能差在哪?虚拟列索引vs多值索引怎么选
数据库·mysql·架构
九皇叔叔1 天前
《MySQL 体系架构详解:Server 层、SQL 执行流程与 InnoDB、MyISAM、MEMORY 存储引擎》
sql·mysql·架构
愤怒的苹果ext1 天前
MySQL Shell备份恢复数据库
数据库·mysql·备份恢复·mysqlsh
超兔一体云1 天前
MySQL索引优化实战——从慢查询到索引调优
后端·mysql
2601_962074811 天前
大数据-264 实时数仓 - Canal MySQL的binlog研究 存储目录 变动信息 配置MySQL
大数据·数据库·mysql
2601_962073811 天前
大数据-240 离线数仓 - 广告业务 测试 ADS层数据加载 DataX数据导出到 MySQL
大数据·数据库·mysql
这个DBA有点耶1 天前
SQL:2023新特性详解:JSON_TABLE、GREATEST/LEAST、QUALIFY 到底怎么用?
数据库·sql·mysql
小王C语言1 天前
MySQL 用户管理:创建用户、给用户授权
数据库·mysql
小镇敲码人1 天前
【深入浅出】之Qt 事件系统实战:鼠标、键盘、滚轮、窗口与定时器事件
数据库·qt·网络协议·mysql·http
Sirens.1 天前
MySQL数据库:索引
数据库·mysql