PSQLException:ERROR: value too long for type character(1)

文章详细介绍了使用MyBatis类型处理器处理枚举转字符时遇到的问题,通过修改代码解决了数据库保存错误的问题,并分享了解决过程和最终修正后的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java使用mybatis的typehandler处理char类型的enum 传值进数据库的时候出现这个情况:

数据库拿出来的时候enum 转型是没有问题的,传入数据库的时候出现这个问题

附一下代码:

public enum Flag {

    ACTIVE('a'),
    INACTIVE('i'),
    DUPLICATED('d'),
    PURGE('p')
    ;

    private char value;

    public static Flag findByValue(char value) {
        for (Flag flag : values()) {
            if (flag.getValue() == value) {
                return flag;
            }
        }
        return null;
    }

    Flag(char value) {
        this.value = value;
    }

    public final char getValue() {
        return this.value;
    }

}
public class FlagTypeHandler extends BaseTypeHandler<Enum<Flag>> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Enum<Flag> flag, JdbcType jdbcType) throws SQLException {
        ps.setString(i,flag.name());
    }

    @Override
    public Enum<Flag> getNullableResult(ResultSet rs, String columnName) throws SQLException {
        char value = rs.getString(columnName).charAt(0);
        return Flag.findByValue(value);
    }

    @Override
    public Enum<Flag> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        char value = rs.getString(columnIndex).charAt(0);
        return Flag.findByValue(value);
    }

    @Override
    public Enum<Flag> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        char value = cs.getString(columnIndex).charAt(0);
        return Flag.findByValue(value);
    }

}

1.把数据库的char(1) 改成 char(255),传入"ACTIVE",成功,但是数据库保存的是"ACTIVE",显然typeHandler解析错误

2.仔细看一下代码,是在 "ps.setString(i,flag.name());" 这里出错,修改成:

ps.setString(i,String.valueOf(flag.name().charAt(0)));

试了一下,传入ACTIVE ,没有报错,数据库变成A

不对劲,看了一下,上面这个是取了name第一个字母,应该取得是value

3. 再修改

 ps.setString(i,Character.toString(Flag.valueOf(flag.name()).getValue()));

再次测试,传入"ACTIVE" 数据库存放"a",成功

4.贴一下最终改好的代码

public class FlagTypeHandler extends BaseTypeHandler<Enum<Flag>> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Enum<Flag> flag, JdbcType jdbcType) throws SQLException {
        ps.setString(i, Character.toString(Flag.valueOf(flag.name()).getValue()));
    }

    @Override
    public Enum<Flag> getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return Optional.ofNullable(rs.getString(columnName)).flatMap(s -> Optional.ofNullable(Flag.findByValue(s.charAt(0)))).orElse(null);
    }

    @Override
    public Enum<Flag> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return Optional.ofNullable(rs.getString(columnIndex)).flatMap(s -> Optional.ofNullable(Flag.findByValue(s.charAt(0)))).orElse(null);
    }

    @Override
    public Enum<Flag> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return Optional.ofNullable(cs.getString(columnIndex)).flatMap(s -> Optional.ofNullable(Flag.findByValue(s.charAt(0)))).orElse(null);
    }

}

5.总结

对typeHandler 不熟悉导致 解析的时候写错了,要取的 value 写成name。特别感谢老大帮忙,耶

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值