映射嵌套的UDT对象

时间:2019-12-05 12:28:43

标签: postgresql jdbc pgjdbc-ng

我正在尝试使用直接映射的对象插入嵌套的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 + '\'' +
                '}';
    }
}

0 个答案:

没有答案