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中的数据库名去掉了】,就没再报这个问题了

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

相关推荐
Rain的Java大神之路10 小时前
如何快速上传10G文件
java·spring boot·redis·后端·mysql·spring cloud·面试
大海星辰79812 小时前
一次对账SQL“灵异事件”排查:NOT IN返回空集的坑
mysql
Linux-lucky12 小时前
32-38-Linux学习之旅之MySQL综合
linux·运维·学习·mysql·ubuntu
&不羁之风&15 小时前
从 MySQL 到 MongoDB:80 万系统日志(sys_log)平滑迁移完整实战(含 Windows 环境 mongoimport 安装与避坑)
mysql·mongodb
这个DBA有点耶16 小时前
InnoDB页结构深入:页分裂、页合并、填充因子——B+树底层机制全解析
数据库·mysql·架构
山岚的运维笔记16 小时前
mysql 专业笔记 -- 第 36 章:MySQL 管理
运维·数据库·笔记·后端·mysql·oracle·dba
霸道流氓气质18 小时前
SQL 里的 AND / OR 优先级陷阱:一个括号引发的“数据越界“
mysql
爱奥尼欧21 小时前
【MySQL】建库就是建目录?字符集校验规则、备份恢复与alter改表实操
mysql
大虾别跑21 小时前
mysql5.7升级
mysql
geovindu21 小时前
sql: Transaction & Concurrency Patterns using mysql 9.0
mysql·数据库开发·数据库架构