疑似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