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


问题

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

 一点思考

如果能重载一些方法,添加形参可能有办法解决这个问题。比如一些框架中形参会有

JavaType type
JdbcType type


#官方既有方法
 public Criteria andNotEqualTo(String property, Object value) {
    addCriterion(column(property) + " <>", value, property(property));
    return (Criteria) this;
}

#重载示例如下
 public Criteria andNotEqualTo(String property, Object value,JavaType type) {
    ....
}

 public Criteria andNotEqualTo(String property, Object value,JdbcType type) {
    .....
}

让用户在一些字段数据类型模棱两可的情况下,可以自定义类型,让框架去处理。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM