问题:
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也可能是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的时候,直接用PGobject的方式。
PGobject pGobject = new PGobject(); pGobject.setType("BIT"); pGobject.setValue("1"); pstmt.setObject(i,pGobject);
+++++++++++++++==========华丽的分割线==============++++++++++++++++++
发现有不少人私信我set 类型BIT(1)是的报错问题,这里统一再解释下。
我之前写ps.setObject(i,object)。此处的object是指PGobject类型。
直接拿一个网友的举例:
public static void main(String[] args) {
// 数据库连接信息
String url = "jdbc:postgresql://localhost:5432/postgres";
String username = "postgres";
String password = "123456";
// SQL语句
String sql = "insert into h_user (username, password, gender,height) values(?,?,?,?)";
try {
// 加载并注册JDBC驱动
Class.forName("org.postgresql.Driver");
// 建立数据库连接
try (Connection conn = DriverManager.getConnection(url, username, password);
// 创建PreparedStatement
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, "ztt");
pstmt.setString(2, "123456");
// 设置bit(1)值,bit如果长度为1,则会默认为布尔型
PGobject pGobject = new PGobject();
pGobject.setType("BIT");
pGobject.setValue("1");
pstmt.setObject(3,pGobject);
pstmt.setFloat(4, 170);
// 执行SQL语句
pstmt.executeUpdate();
}
} catch (Exception e) {
e.printStackTrace();
}
}
数据库:
CREATE TABLE "public"."h_user" (
"id" serial4 not null,
"username" varchar(50) COLLATE "pg_catalog"."default",
"password" varchar(64) COLLATE "pg_catalog"."default",
"nickname" varchar(60) COLLATE "pg_catalog"."default",
"email" varchar(255) COLLATE "pg_catalog"."default",
"gender" bit(1),
"height" float4,
CONSTRAINT "user_pkey" PRIMARY KEY ("id")
)
看不懂的再问吧。