问题:
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))
select * from tb4 where bit55= CAST(B'1' as BIT(1));
第二种:含bit类型的insert或者update入参:
对于 ResultSetMetaData 中获取值的时候,也可以用如下方式,将其封装成PGobject :
case -7://可能是bit也可能是booleanString 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);
结束。