背景:
最近以前上线的项目需要做报表汇报,所以小组长看我不是很忙就让我跟着做了,其中三小个模块内容即三个接口,第一个是直接对接第三方接口(涉及到三个),第二个是直接接入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中的数据库名去掉了】,就没再报这个问题了
本人是菜鸡。。。。。。。。。