开发踩坑记录,不定时更新
—2021.4.14—
使用easypoi poi报错
cn.afterturn.easypoi.exception.excel.ExcelExportException: Excel导出错误
Caused by: java.lang.NoSuchMethodError: org.apache.poi.ss.usermodel.CellStyle.setAlignment(S)V
java.lang.reflect.InvocationTargetException: null
问题错误原因为poi依赖缺少或者是easypoi版本太低导致,项目中使用的为3.0.1版本,又忽略了poi版本,导致报错。
解决方案:
可以修改easypoi版本为最新版本,
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
<version>4.2.0</version>
</dependency>
然后把maven中org下poi的jar包删除一个3.15的 留下3.17 ,jar包版本冲突。
—2021.5.08—
报错信息:
check the manual that corresponds to your MySQL server version for the right syntax,
MySQL server version for the right syntax to use near
可能遇到的问题:
tips1:可能是关键字冲突了;
tips2:可能是SQL语句写错了;
我实际开发中遇到的问题是tips1,数据库表字段与SQL关键字冲突导致的错误。
解决方式:
把报错的sql语句放在navicat上执行一下,navicat会把sql语句中是否是SQL的关键字标记出来。
然后修改与SQL关键字冲突的字段,这样就解决了。
—2021.5.12—
问题:
下拉筛选框条件查询 前后端值不匹配问题。
解决思路:
1.把参数放到实体类,然后将实体类当参数去查询。
2.获取到的数据,用key来equals字段,如果匹配,就把这个key和value传到对应的字段。
3.既然他不确定个数,肯定传回来的是数组或者集合,遍历这个集合,然后用key equals每个字段,如果匹配,就吧values set进对应的字段。
4.这样这个对象里面字段有的有值有的为null,然后xml里面用if标签,进行判断,不为空就说明前端传了内容回来。
假如我这个student是你的那个数据库实体类,这样传。
你这两个不是一样么,都是advertiserCode,这不相当于我Student里面的name字段名么,然后ttoe相当于我的张三。
前端给你的数据应该和我的map大差不差,你就遍历这个给你的数据集合,建一个对应的实体类对象,然后key和实体类字段比较,这里得辛苦点每个都得比,然后必然会有匹配的,然后set进去,这样就可以把前端给你的所有内容都放到实体类对象中了,然后把这个对象当参数,送到sql那边,动态拼接。
—2021.5.12—
查询数据时,数据库表里没有数据。就给前端返回集合时为空[ ],
不能是null,这样会不显示数据。
代码:
查询完数据库之后,DTO接完之后。
数据库中没有数据时,再进行判断一下。判断这个集合为空的话直接返回空集合就ok了。
if(CollectionUtils.isEmpty(baseSearchResultDTO.getResultList())){
baseSearchResultDTO.setResultList(new ArrayList<AccountReportWrapper>());
return new DelivertoolResult().resultMessage(baseSearchResultDTO);
}
如果不是空的话,就直接返回数据即可。
return new DelivertoolResult().resultMessage(baseSearchResultDTO);
—2021.5.13—
在SQL语句中,进行计算。
SELECT *FROM t_app_toutiao_report_creative
进行乘除计算:
SELECT
la.account,
la.producer_ad_id,
la.deep_convert,
(la.account/la.deep_convert)*100 AS click_landing_page
FROM t_app_toutiao_report_creative AS la
—2021.5.18—
在数据库设计的时候,要注意float类型的数据。看看是否显示的是小数。如果是小数,在数据库表设计的时候,要添加小数的设计。
—2021.5.19—
stream 计算一个List对象中某个字段总和
int total = list.stream().mapToInt(User::getAge).sum();
—2021.5.20—
Stream的filter对List里面对象属性值过滤出空指针异常解决
在项目中使用stream的filter对list里的对象属性值判断时,如果对象属性值有null会
报空指针异常。(如上文中的Stu对象的age属性出现null值)。
解决方法:对此属性先做非空判断,注意:非空判断放前面
public class nullExcDemo {
public static void main(String[] args) {
List<Stu> list = new ArrayList<>();
list.add(new Stu(19, "sire"));
list.add(new Stu(23, "abc"));
list.add(new Stu(78, "ab"));
list.add(new Stu(null, "g"));
/**
* 在项目中使用stream的filter对list里的对象属性值判断时,如果对象属性值有null会
* 报空指针异常。(如上文中的Stu对象的age属性出现null值)。
* 解决方法:对此属性先做非空判断,注意:非空判断放前面
*/
// 会报null指针异常
// List<Stu> filtered = list.stream().filter(s -> s.getAge()==19).collect(Collectors.<Stu>toList());
// 加非空判断在后面也会报null指针异常
// List<Stu> filtered = list.stream().filter(s -> s.getAge()==19 && s.getAge() != null).collect(Collectors.<Stu>toList());
// 解决空指针异常
List<Stu> filtered = list.stream().filter(s -> s.getAge() != null && s.getAge()==19).collect(Collectors.<Stu>toList());
System.out.println(filtered);
}
}
```java
@Data
class Stu{
private Integer age;
private String name;
public Stu(Integer age, String name) {
this.age = age;
this.name = name;
}
}
—2021.5.21—
前端入参为一个参数(类型为String),可以通过一个参数进行筛选查询。
后端 接收到这个参数String account
1.先进行判断 如果为空,则查询全部。
2.如果不为空则进行条件查询。
2.1.1
sql语句可以写为
"WHERE " ,
"la.account_alias LIKE CONCAT('%',#{account},'%') ",
" OR la.promote_account_id LIKE CONCAT('%',#{account},'%') " ,
这样使用模糊查询,可以进行一个参数,多条件查询。
**前提:**保证 进行多条件查询时 类型要保持一致,这里都是String类型。