【问题标题】:Mybatis + Spring Boot : @Update is not workingMybatis + Spring Boot:@Update 不工作
【发布时间】:2021-11-17 14:04:29
【问题描述】:

我正在尝试使用 @update 注释进行更新。查询触发正常,没有任何异常,但方法每次返回 0(更新 0 行)。数据库中没有更新。并且相同的查询在 SQLdeveloper 工具中运行良好。 使用 Oracle 数据库。

 @Update(
     "UPDATE extra.EMMT SET CASE_STATUS = #{updateBean.CASE_STATUS}, CASE_STATUS_TimeStmp = #{updateBean.CASE_STATUS_TimeStmp} WHERE T_TimeStmp >= #{updateBean.LAST_T_TimeStmp} AND T_TimeStmp <= #{updateBean.T_TimeStmp} AND T_NO = #{updateBean.T_NO} AND EM_NO =  #{updateBean.EM_NO}"
     )

public long update(@Param("updateBean") EMMT updateBean);

“EMMT updateBean”是与表 EMMT 的列具有相同成员的类。

我还尝试创建两个不同的会话,一个用于更新,另一个用于插入,但没有太大帮助。

会话配置。

@Bean(name = "updatesession")
public SqlSessionFactory sqlSessionFactoryupdate() throws Exception {
    SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
    factoryBean.setDataSource(dataSource);
    
    
    SqlSessionFactory sqlSessionFactory = factoryBean.getObject();
    sqlSessionFactory.getConfiguration().setJdbcTypeForNull(JdbcType.NULL);
    sqlSessionFactory.getConfiguration().setDefaultStatementTimeout(15);
    sqlSessionFactory.getConfiguration().addMappers("com.xyz.myapp.mapper");
    
    return sqlSessionFactory;
}

使用Mybatis-spring - 2.2.0

<dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.0</version>
    </dependency>

任何帮助都将不胜感激。 谢谢。

示例 - 上面给出了sqlSession的配置。

豆类。

 class justForUpdate {
     String CASE_STATUS;
     String EM_NO ;
     Timestamp T_TimeStmp;
     Long T_NO ;
     Timestamp CASE_STATUS_TimeStmp;
     Timestamp LAST_T_TimeStmp;
     
}

服务等级

    updateservice {


@Autowired
private SqlSessionFactory sessions;

        public void work() {
    
          //obj of justForUpdate = auth
         //or can pass list of justForUpdate objs.
                
            try(SqlSession session = sessions.openSession(true)){
                
                Update_mapper upd = session.getMapper(Update_mapper.class);
                
                long val = upd.update(auth);
                System.out.print(">>>>>>>>>  "+val);
                
            }
            
            }
        
        
        }

Update_Mapper

@Mapper
public interface Update_mapper {

@Update(
         "UPDATE extra.EMMT SET CASE_STATUS = #{updateBean.CASE_STATUS}, CASE_STATUS_TimeStmp = #{updateBean.CASE_STATUS_TimeStmp} WHERE T_TimeStmp >= #{updateBean.LAST_T_TimeStmp} AND T_TimeStmp <= #{updateBean.T_TimeStmp} AND T_NO = #{updateBean.T_NO} AND EM_NO =  #{updateBean.EM_NO}"
         )
    
    public long update(@Param("updateBean") EMMT updateBean);

}

【问题讨论】:

  • 当数据库中没有满足UPDATE 语句的WHERE 谓词的记录时,预计会更新零行。根据您的信息,我们无能为力。只能说,如果您在 update 之外的其他会话中 insert - 并且不提交 insert - 这正是您应该做的期待...
  • 嗨@MarmiteBomber,感谢您的回复。但问题是,即使对于小而简单的更新查询,同样的事情也会发生。 UPDATE extra.EMMT SET CASE_STATUS = #{updateBean.CASE_STATUS} WHERE EM_NO = #{updateBean.EM_NO} .. 应用程序执行查询正常,但返回 0。我也尝试了单个会话,没有任何帮助。
  • 请发布一个可重现的示例,否则没有机会提供帮助...
  • @MarmiteBomber 完成。
  • @Akif,如果你能分享一个像these 这样的小型演示项目,我会研究一下。

标签: oracle spring-boot mybatis spring-mybatis


【解决方案1】:

对于其他可能遇到同样愚蠢问题的人。

快速修复是在我的查询中使用“TRIM()”和列名。 一些列被定义为 40 字节。因此包含多个空格。

@Update(
"UPDATE extra.EMMT SET CASE_STATUS = #{updateBean.CASE_STATUS}, CASE_STATUS_TimeStmp = #{updateBean.CASE_STATUS_TimeStmp} WHERE T_TimeStmp >= #{updateBean.LAST_T_TimeStmp} AND T_TimeStmp <= #{updateBean.T_TimeStmp} AND TRIM(T_NO) = #{updateBean.T_NO} AND TRIM(EM_NO) =  #{updateBean.EM_NO}")
        
    public long update(@Param("updateBean") EMMT updateBean);
    
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 2019-06-06
    • 1970-01-01
    • 2019-04-25
    • 2016-05-11
    • 2017-03-07
    相关资源
    最近更新 更多