DDCMS-Service后端searchCompany接口解决报错
# DDCMS-Service后端searchCompany接口解决报错
# DDCMS—Front发送请求失败
# 查看报错
这里我排查了一下,前端的代码没有问题,发送请求和参数绑定都是正常的,然后问题是出现在后端的部分。
查看当前的后端日志情况:
这里很明显可以看出来,是mybatis的报错,就是无法绑定参数。status字段没有找到。
# 追溯代码
找到当前的controller
下面的AccountController
接口,然后点击追溯到对应的业务实现类,searchCompanies方法。
问题就是出现在这里的代码中,分别是accountInfoMapper
的totalCountWithStatus
方法和companyInfoMapper
的listCompanyWithStatus
方法中的sql语句参数绑定失效。
如上的图中可以很清晰的看到,searchCompanies
这个方法传参是SearchAccountRequest
类,但是这个类没有对应的数据库映射的关系,参数传值有时候需要使用后面的@Param
注解进行绑定。
@Data
@EqualsAndHashCode(callSuper = true)
public class SearchAccountRequest extends CommonPageQueryRequest {
@Pattern(regexp = "0|1|2|3", message = "账户状态不正确")
private String accountStatus = "0";
private String keyWord;
}
dev分支上面,原来的代码如下:
- 这里是
AccountMapper
中的totalCountWithStatus
方法,根据状态统计。
@Select(
"<script>"
+ "SELECT COUNT(1) FROM t_account_info a INNER JOIN t_company_info c ON a.pk_id = c.account_id "
+ "WHERE a.account_type < 3 "
+ "<if test='status > 0'> AND a.status = #{status} </if>"
+ "<if test='keyWord != null'> AND c.company_name LIKE CONCAT('%', #{keyWord}, '%') </if>"
+ "</script>")
int totalCountWithStatus(String keyWord, int status);
- 这里是
CompanyMapper
中的listCompanyWithStatus
根据状态查询所有的公司。
@Select(
"<script>"
+ "SELECT a.*, c.* FROM t_company_info c INNER JOIN t_account_info a ON c.account_id = a.pk_id WHERE a.account_type < 3 "
+ "<if test='status > 0'> AND a.status = #{status} </if>"
+ "<if test='keyWord != null'> AND c.company_name LIKE CONCAT('%', #{keyWord}, '%') </if>"
+ "ORDER BY c.create_time DESC LIMIT #{offset}, #{pageSize}"
+ "</script>")
@ResultType(AccAndComInfoBO.class)
List<AccAndComInfoBO> listCompanyWithStatus(
int status, String keyWord, long offset, int pageSize);
问题说明:
在方法参数上添加
@Param
注解并指定参数名称,可以确保 MyBatis 能够正确识别参数。使用Integer
类型作为参数,可以处理更广泛的情况,包括传递null
值。
# 解决问题
如下是修改之后的代码:
- 我使用了
Param
注解绑定参数,更换成了companyName
,对应的是数据库中表的字段,MyBatis 默认情况下会开启驼峰命名规则的自动映射。 - 换成了
Integer
类型的status
。
@Select(
"<script>"
+ "SELECT COUNT(1) FROM t_account_info a INNER JOIN t_company_info c ON a.pk_id = c.account_id "
+ "WHERE a.account_type < 3 "
+ "<if test='status > 0'> AND a.status = #{status} </if>"
+ "<if test='companyName != null'> AND c.company_name LIKE CONCAT('%', #{companyName}, '%') </if>"
+ "</script>")
int totalCountWithStatus(@Param("companyName") String companyName,@Param("status") Integer status);
- 这里也加上了
@Param
注解并把keyWorld
替换了companyName
。
@Select(
"<script>"
+ "SELECT a.*, c.* FROM t_company_info c INNER JOIN t_account_info a ON c.account_id = a.pk_id WHERE a.account_type < 3 "
+ "<if test='status > 0'> AND a.status = #{status} </if>"
+ "<if test='companyName != null'> AND c.company_name LIKE CONCAT('%', #{companyName}, '%') </if>"
+ "ORDER BY c.create_time DESC LIMIT #{offset}, #{pageSize}"
+ "</script>")
@ResultType(AccAndComInfoBO.class)
List<AccAndComInfoBO> listCompanyWithStatus(
@Param("status") Integer status, @Param("companyName") String companyName, @Param("offset") Long offset, @Param("pageSize") Integer pageSize);
注意:需要编译打包一下,启动jar。
- 我这里直接使用.\gradlew bootJar重新打包了一下然后部署正常。
然后重启项目刷新一下前端,已经没有了报错的问题: