问题
本地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
解决方法1
<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(2021-12-5)
<select id="queryOne" resultType="com.h2.mes.entity.Pallet"> <![CDATA[ SELECT * FROM pallet_${projectName} WHERE (f_woid = #{fWoid} and pallet_id <> #{palletId,jdbcType=VARCHAR} 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) { ..... }
让用户在一些字段数据类型模棱两可的情况下,可以自定义类型,让框架去处理。
2021-12-5更新:
经过笔者对源代码的了解,需要改造的地方比较多,要大改:
还有tk.mybatis.mapper.entity.Mapper,这里要大改
其他参考:
本博客文章绝大多数为原创,少量为转载,代码经过测试验证,如果有疑问直接留言或者私信我。
创作文章不容易,转载文章必须注明文章出处;如果这篇文章对您有帮助,点击右侧打赏,支持一下吧。
创作文章不容易,转载文章必须注明文章出处;如果这篇文章对您有帮助,点击右侧打赏,支持一下吧。