我正在尝试使用直接映射的对象插入嵌套的UDT。一切看起来都不错,但出现错误:
PGSQLSimpleException:数据类型错误:1043,预期为25
阅读时一切正常。我正在使用pgjdbc-ng
版本0.8.3和postgresql
版本12
CREATE TYPE public.person AS
(
fname character varying(255),
lname character varying(255)
);
CREATE TYPE public.boss AS
(
person person,
comment text
);
CREATE TABLE public.t3
(
id integer,
boss boss
)
public class TestNG {
public static void main(String[] args) throws SQLException {
Map<String, Class<?>> map = new HashMap<>();
map.put(Person.TYPE_NAME, Person.class);
map.put(Boss.TYPE_NAME, Boss.class);
Connection connection = DriverManager.getConnection("jdbc:pgsql://localhost:5432/test", "admin", "*********");
connection.setTypeMap(map);
String query = "insert into t3 values (?, ?)";
try(PreparedStatement statement = connection.prepareStatement(query)) {
Person person = new Person("ng name 1", "ng name 2");
Boss boss = new Boss(person, "ng comment");
statement.setInt(1, 1);
statement.setObject(2, boss, Boss.TYPE);
statement.execute();
}
query = "select * from t3";
try(PreparedStatement statement = connection.prepareStatement(query)) {
try(ResultSet rs = statement.executeQuery()) {
while (rs.next()) {
System.out.println(rs.getInt(1));
System.out.println(rs.getObject(2));
}
}
}
connection.close();
}
}
public class Person implements SQLData {
public static final String TYPE_NAME = "public.person";
public static final PGAnyType TYPE = new PGAnyType() {
@Override
public String getName() {
return Person.TYPE_NAME;
}
@Override
public String getVendor() {
return "UDT Generated";
}
@Override
public Integer getVendorTypeNumber() {
return null;
}
@Override
public Class getJavaType() {
return Person.class;
}
};
private String fName;
private String lName;
public Person() {
}
public Person(String fName, String lName) {
this.fName = fName;
this.lName = lName;
}
public String getfName() {
return fName;
}
public void setfName(String fName) {
this.fName = fName;
}
public String getlName() {
return lName;
}
public void setlName(String lName) {
this.lName = lName;
}
@Override
public String getSQLTypeName() throws SQLException {
return TYPE_NAME;
}
@Override
public void readSQL(SQLInput stream, String typeName) throws SQLException {
fName = stream.readString();
lName = stream.readString();
}
@Override
public void writeSQL(SQLOutput stream) throws SQLException {
stream.writeString(fName);
stream.writeString(lName);
}
@Override
public String toString() {
return "Person {" +
"fName='" + fName + '\'' +
", lName='" + lName + '\'' +
'}';
}
}
public class Boss implements SQLData {
public static final String TYPE_NAME = "public.boss";
public static final PGAnyType TYPE = new PGAnyType() {
@Override
public String getName() {
return Boss.TYPE_NAME;
}
@Override
public String getVendor() {
return "UDT Generated";
}
@Override
public Integer getVendorTypeNumber() {
return null;
}
@Override
public Class getJavaType() {
return Boss.class;
}
};
private Person person;
private String comment;
public Boss() {
}
public Boss(Person person, String comment) {
this.person = person;
this.comment = comment;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
@Override
public String getSQLTypeName() throws SQLException {
return TYPE_NAME;
}
@Override
public void readSQL(SQLInput stream, String typeName) throws SQLException {
person = stream.readObject(Person.class);
comment = stream.readString();
}
@Override
public void writeSQL(SQLOutput stream) throws SQLException {
stream.writeObject(person, Person.TYPE);
stream.writeString(comment);
}
@Override
public String toString() {
return "Boss {" +
"person=" + person +
", comment='" + comment + '\'' +
'}';
}
}