当前使用版本(必填,否则不予处理)
V3.4.1
该问题是如何引起的?(确定最新版也有问题再提!!!)
在字段上设置typeHandler,使用LambdaQueryWrapper查询时没有生效
用mybatis-plus-sample-typehandler测试过,也是异常
重现步骤(如果有就写完整)
@Data
@Accessors(chain = true)
@TableName(autoResultMap = true)
public class User {
private Long id;
private String name;
@TableField(jdbcType = JdbcType.INTEGER, typeHandler = EnumOrdinalTypeHandler.class)
private Gender gender;
}
@Test
public void testLambdaQuery() {
LambdaQueryWrapper<User> where = Wrappers.lambdaQuery(User.class);
where.eq(User::getGender, Gender.FEMALE);
List<User> users = userMapper.selectList(where);
System.err.println(users.size());
}
报错信息
Preparing: SELECT id,name,age,email,gender,wallet,other_info FROM user WHERE (gender = ?)
Parameters: FEMALE(String) -- 这里没有使用typeHandler, 正确值应该是2(Integer)
跟了一下代码,应该是AbstractWrapper.addCondition这里的问题
Comment From: lingfenghu
我也遇到这个问题了,分页查询的时候,自定义的typeHandler也没有生效,导致发生SQLDataException: Unsupported conversion from LONG to java.sql.Timestamp
Comment From: qmdx
wrapper typeHandler 用法
// wrapper typeHandler 测试
LambdaUpdateWrapper<User> wrapper = Wrappers.<User>lambdaUpdate().set(User::getWallets, Arrays.asList(new Wallet("Tom",
Arrays.asList(new Currency("RMB", 1000d)))), "typeHandler=com.baomidou.mybatisplus.samples.typehandler.WalletListTypeHandler");
wrapper.eq(User::getId, 2L);
Assertions.assertEquals(userMapper.update(new User().setAge(99), wrapper), 1);
System.err.println(userMapper.selectById(2));
Comment From: Endwas
知道怎么解决了吗。。上面给的方式是LambdaUpdateWrapper,issue不是问的是查询的时候吗。。
Comment From: zhaohuihua
@qmdx 字段上通过注解设置了typeHandler,还要手工设置,代码巨丑 我都改好了,怎么不给合入呀,555555555
看到没,不只我一个人这么认为吧
Comment From: frank780117
在 entity 上使用 @TableName(autoResultMap = true) 就可以了
Comment From: zkytech
wrapper typeHandler 用法
```
// wrapper typeHandler 测试 LambdaUpdateWrapper<User> wrapper = Wrappers.<User>lambdaUpdate().set(User::getWallets, Arrays.asList(new Wallet("Tom", Arrays.asList(new Currency("RMB", 1000d)))), "typeHandler=com.baomidou.mybatisplus.samples.typehandler.WalletListTypeHandler"); wrapper.eq(User::getId, 2L); Assertions.assertEquals(userMapper.update(new User().setAge(99), wrapper), 1); System.err.println(userMapper.selectById(2));```
硬编码 + 重复指定typeHandler,这个解决方案确实不太好。