共计 1237 个字符,预计需要花费 4 分钟才能阅读完成。
问题一:字段名不存在
执行如下语句的时候呈现了问题:
Test entity = new Test();
entity.setName(new RandomString().nextString());
entity.setFatherTestId(new RandomString().nextString());
Integer insNum = testMapper.insert(entity);
这里使用了 mapper 自带的 insert 办法向数据库中插入数据。
在用 mapper 进行插入的时候后,报了这样的谬误:字段名不存在。
然而去数据表中查看,实际上是有 fatherId 这个字段的。
就纳闷 为什么后盾会找不到这个字段
?
并认真看红色的的报错,后盾说 fatherid
这个字段找不到。
这里我发现了端倪,数据库中表定义的是 fatherId, i 这个字母是大写的。
猜想是因为 数据库字段大小写的问题。
之后去谷歌之后找到了答案:
起因:在于 PostgreSQL 对表名、字段名都是辨别大小写的。在执行 SQL 时,那么不论你的 SQL 中字段是大写还是小写,最初都会默认转为小写去执行。
解决:
1. 数据库字段名改为小写。或者用下划线_宰割。
起初改为下划线后运行失常
2. 写 sql 语句的时候,对表名或者字段名加上双引号
定义 SQL 的时候,对表名及字段名加上双引号,能够避免大写字段被转为小写去执行。
因为在 PGSQL 中,默认对 SQL 语句进行抹去双引号和大写转小写的其中一个 , 且抹去双引号优先级比拟高,因而当大写字段被加上双引号,只进行了抹去双引号的解决而不会再被转为小写了。
例如这样,加上双引号。
最初因为 我这里应用的是 mapper 自带的 insert 函数来进行数据插入 ,并没有本人写 sql 语句。
所以最初采纳了第一种形式解决。
问题二:char(32)类型字段,查问进去的数据带有空格
Integer insNum = testMapper.insert(entity);
Assert.isTrue(insNum.equals(1), "insert success");
String id = entity.getId();
Test getEntity = testMapper.selectById(id);;
Assert.isTrue(getEntity.getName().equals(entity.getName()), "name not equal");
在后盾单元测试的时候,进行了断言:插入的数据和查问进去的数据雷同。
也就是说,将一条数据插入到数据库中,再将其查问进去,判断这两个数据的属性都雷同。
然而 单元测试始终没通过。
在代码中打断点测试中发现,发现从数据库中 查问进去的数据都带有空格。如下图。
猜想是因为 postgresql 在保留的时候会,主动将数据长度用空格补充至 32 位。
后果用 testMapper 自带的 selectById 办法查问出数据的时候,就会带有空格。
如果是这样的话,用 mapper 查问数据进去之后,还须要用 trim()函数将空格一一去除。