問題
本地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) { ..... }
讓用戶在一些字段數據類型模棱兩可的情況下,可以自定義類型,讓框架去處理。
