Postgresql在jdbc处理bit字段的解决方案

问题:

        bit如果长度为1,则会默认为布尔型(1-true 0-false);

        bit如果长度大于1,则会默认为bit类型,但是代码中以前常用的两种set方式,会报错

第一种方式:
ps.setObject(i+1, obj, Types.BIT);

 第二种方式:

ps.setByte(i+1, Byte.valueOf((String)obj));

 报错内容:

was aborted: 错误: 字段 "bit55" 的类型为 bit, 但表达式的类型为 boolean
  Hint: 你需要重写或转换表达式
  Position: 1124  Call getNextException to see other errors in the batch.
 

 解决方式:

       第一种:含有bit类型的where条件查询:

        经查阅,发现这个数据库在处理这个字段缺失存在问题,需要我们转换思想,在进行sql预处理的时候,就对bit字段进行转换: CAST(? as BIT(长度))。

        转换的sql也是可以查出值的。

select * from tb3 where bit55= CAST(B'10' as BIT(2))

Postgresql在jdbc处理bit字段的解决方案_第1张图片

 select * from tb4 where bit55= CAST(B'1' as BIT(1));

Postgresql在jdbc处理bit字段的解决方案_第2张图片

第二种:含bit类型的insert或者update入参: 

对于 ResultSetMetaData 中获取值的时候,也可以用如下方式,将其封装成PGobject :

case -7://可能是bit也可能是boolean
                    String temp = resultset.getString(i);
                    if(temp == null){
                        data.add(null);
                    }else if(temp.equalsIgnoreCase("F") || temp.equalsIgnoreCase("T")){
                        data.add(resultset.getBoolean(i));
                    }else{
                        if(rsmd.getColumnTypeName(i).equalsIgnoreCase("bit")){
                            PGobject pGobject = new PGobject();
                            pGobject.setType(rsmd.getColumnTypeName(i));
                            pGobject.setValue(resultset.getString(i));
                            data.add(pGobject);
                        }else{
                            data.add(resultset.getBoolean(i));
                        }
                    }
                    break;

在set的时候,直接用object的方式。

ps.setObject(i+1,obj);

 结束。

你可能感兴趣的:(数据库,数据库)