当前使用版本(必填,否则不予处理)

V3.4.1

该问题是如何引起的?(确定最新版也有问题再提!!!)

在字段上设置typeHandler,使用LambdaQueryWrapper查询时没有生效 用mybatis-plus-sample-typehandler测试过,也是异常 MyBatis-Plus 在字段上设置typeHandler,使用LambdaQueryWrapper查询时没有生效

重现步骤(如果有就写完整)

@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这里的问题 MyBatis-Plus 在字段上设置typeHandler,使用LambdaQueryWrapper查询时没有生效

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

看到没,不只我一个人这么认为吧 MyBatis-Plus 在字段上设置typeHandler,使用LambdaQueryWrapper查询时没有生效

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,这个解决方案确实不太好。