java - 未找到参数“状态”。Mybatis 和 Spring 中可用的参数有 [0, 1, param1, param2]
问题描述
我正在使用 mybatis 和 spring,我想比较 2 个日期时间,然后将数据更新到数据库中
我的服务和映射器:
@Override
public void insertOrUpdateStatusOfSendSMS(BigDecimal smsId, String status) {
smsBrandingListMapper.insertOrUpdateStatusOfSendSMS(smsId, status);
}
这是我的代码(控制器类):
smsBrandingList = smsService.selectListSMSBranding(params);
DateTimeFormatter dtFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm");
for(int i=0 ; i< smsBrandingList.size() ; i++) {
System.out.println(smsBrandingList.get(i).get("scheduled"));
System.out.println(smsBrandingList.get(i).get("smsId"));
BigDecimal smsId = (BigDecimal) smsBrandingList.get(i).get("smsId");
System.out.println(smsId);
String smsSendStatusScheduled = (String) smsBrandingList.get(i).get("scheduled");
LocalDateTime localDateTime = LocalDateTime.parse(smsSendStatusScheduled , dtFormatter) ;
// get current time now
LocalDateTime currentTimeNow = LocalDateTime.now();
System.out.println(localDateTime);
System.out.println(currentTimeNow);
if (currentTimeNow.isEqual(localDateTime) ) {
String status = "Sent";
smsService.insertOrUpdateStatusOfSendSMS(smsId, status);
logger.info("CompareTo data and Date -> {}" + SMSConstant.STATUS_SENT);
}
else if (currentTimeNow.isAfter(localDateTime) ) {
String status = "Sent";
smsService.insertOrUpdateStatusOfSendSMS(smsId, status);
logger.info("CompareTo data and Date -> {}" + SMSConstant.STATUS_SENT);
}
else if (currentTimeNow.isBefore(localDateTime) ) {
String status = "Waiting";
smsService.insertOrUpdateStatusOfSendSMS(smsId, status);
logger.info("CompareTo data and Date -> {}" + SMSConstant.STATUS_WAITING);
}
else {
String status = "Unknown";
logger.error("CompareTo data and Date -> {3}" + status);
throw new IllegalStateException("CompareTo data and Date -> {3}" + SMSConstant.STATUS_UNKNOWN);
}
这是我的查询:
<update id="insertOrUpdateStatusOfSendSMS" parameterType="Map">
UPDATE MSC0053M
SET STATUS = #{status}
WHERE SMS_ID = #{smsId}
</update>
当我比较日期时间时,基于 if 的条件,它将更新status
,smsId
但我运行和调试它会发生以下异常:
2021-08-03 18:09:37,707 ERROR [com.coway.trust.config.handler.GlobalExceptionHandler] [defaultException]ex : {}
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'status' not found. Available parameters are [0, 1, param1, param2]
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:76) ~[mybatis-spring-1.2.3.jar:1.2.3]
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:399) ~[mybatis-spring-1.2.3.jar:1.2.3]
at com.myservice.SMSBrandingListServiceImpl.insertOrUpdateStatusOfSendSMS(SMSBrandingListServiceImpl.java:90) ~[classes/:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_144]
at com.myservice.SMSBrandingListServiceImpl.insertOrUpdateStatusOfSendSMS(SMSBrandingListServiceImpl.java:90) ~[classes/:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_144]
我该如何解决这个问题?
解决方案
您parameterType
将 sqlmap 用作Map
,因此您必须将映射器方法的参数与Map
. 但你没有。
正如@planben 评论的那样,如果不将 map 作为映射器的参数传递,您应该定义<sql />
,但这太复杂了。
请尝试下面的代码。
@Override
public void insertOrUpdateStatusOfSendSMS(BigDecimal smsId, String status) {
Map<String, Object> mp = Maps.newHashMap();
mp.put("smsId", smsId);
mp.put("status", status);
smsBrandingListMapper.insertOrUpdateStatusOfSendSMS(mp);
}
推荐阅读
- mysql - 使用 INNER JOIN 返回设置表中多个值匹配的记录
- regex - 拥有包含多年电影的大量 DVD 列表,无法将两者作为列表分开为字典格式
- javascript - 将 Safari Web 扩展部署到 Mac App Store 时出现问题
- python - 如何更改 matplotlib 中 x 轴上的值的显示?
- python - 由于张量转换错误,无法拟合我的 ML 模型
- python - 绘制带有经验数据累积 x 轴的阶跃函数
- postgresql - 如何检查heroku pg:sql之后的输出?
- python - 应用程序在某些 Windows 系统上失败
- sorting - 在 doc elasticsearch 中对数据进行排序
- python - Python Pandas Dataframe:根据列值将值分成两行