疑似tkmybatis的bug:Example动态拼接字符串,报错sql错误

时间:2021-05-08 16:12:05   收藏:0   阅读:37

问题

本地pom

      <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.1.5</version>
        </dependency>
      
        <dependency>
        <groupId>tk.mybatis</groupId>
        <artifactId>mapper-base</artifactId>
        <version>1.1.5</version>
        </dependency>

 

java代码

//查询是否有正在包装的栈板号
        Example example = new Example(Pallet.class);
        example.createCriteria()
                .andEqualTo("fWoid", palletDTO.getFWoid())
                .andNotEqualTo("palletId", palletDTO.getPalletId())
                .andEqualTo("status", 0);
        example.setTableName(format("pallet_%s", projectName));

XxxMapper.selectOneByExample(example);

 

正常情况下的sql语句(pallet_id带入整数)

SELECT *
 FROM pallet_WX10
 WHERE (f_woid = 39 and pallet_id <> 10 and status = 0)
 LIMIT 1;

 

pallet带入字符串

SELECT * FROM pallet_QWQ001 WHERE (f_woid = 42 and pallet_id <> CONCAT("",ZHANBAN1,"") and status = 0);

技术分享图片

 

 

笔者猜测,框架可能根据pallet后缀id去猜解字段数据类型了。

解决方法

1、手工写sql

<select id="queryOne" resultType="com.h2.mes.entity.Pallet">
        <![CDATA[
            SELECT * FROM pallet_${projectName} WHERE (f_woid = #{fWoid} and pallet_id <> ‘${palletId}‘ and status = 0) limit 1
        ]]>
    </select>

2、java代码

 

     //查询是否有正在包装的栈板号
        Map<String,Object> condition = ImmutableMap.<String,Object>builder()
                .put("fWoid", palletDTO.getFWoid())
                .put("palletId", palletDTO.getPalletId())
                .put("projectName", projectName)
                .build();
        final Pallet availPallet = palletMapper.queryOne(condition);
        if (availPallet != null) {
            return new JsonResult(PACK1, PALLET_EXIST_UNFINISHED, availPallet);
        }

 

原文:https://www.cnblogs.com/passedbylove/p/14743991.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!