首页 > 解决方案 > 未找到参数“状态”。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 的条件,它将更新statussmsId但我运行和调试它会发生以下异常:

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]

我该如何解决这个问题?

标签: javaspringspring-mvcmybatis

解决方案


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);
 }

推荐阅读