【发布时间】:2017-10-10 02:04:09
【问题描述】:
我有一个复合类型的数组。假设它看起来像这样:
CREATE TYPE hobbie AS (
name VARCHAR,
description VARCHAR
);
CREATE TABLE person (
id SERIAL,
hobbie hobbie[]
);
现在我需要从 postgres 中检索人的爱好并将它们转换为如下所示的 java 对象:
public class Hobbie {
String name;
String description;
}
我能用 jdbc 做的唯一一件事就是将数组 get 转换为带有爱好的结果集,如 ("basketball","the best game") 这样的字符串。如何使用 jdbc 将其转换为 java 对象?
更新:
这是我使用 jdbc 处理 postgres 数组的代码:
ResultSet hobbies = rs.getArray("hobbies").getResultSet
while (hobbies.next()){
hobbies.getString(1) // returns some index or I don't know
hobbies.getObject(2) // returns PgValue with value == String ("basketball","the best game")
hobbies.getObject(2) // obviously returns String with the same value
hobbies.getArray(2) // returns something strange
hobbies.getObject(2, Hobbie.class) // throws unsupported conversion to class com.test.Hobbie. Maybe there is a way to register custom converter, but I didn't find any
}
【问题讨论】:
-
而你用来转换数组的代码是……?
-
我添加了一个新答案,其中包含从 SQL 查询端解决此问题的方法
-
JDBC 驱动程序将复合类型作为字符串返回。没有任何功能可以注册从复合类型到 Java bean 的任何转换
-
@a_horse_with_no_name 你是对的,但如果它不是字符串,而是 ResultSet 或类似的东西,我自己就能轻松转换它,例如具有 getString(name 或 index)、getLong(...) 等方法的东西。
-
正如我所说:驱动程序返回一个字符串。
java.sql.Struct可能会更好(并遵守 JDBC 规范),但它目前不这样做。如果你需要它,你需要自己实现它。我相信驱动程序的开发人员会很高兴有一个补丁可以做到这一点
标签: java postgresql jdbc