【问题标题】:How to convert array of composite type to array of java objects with jdbc and Postgres?如何使用 jdbc 和 Postgres 将复合类型数组转换为 java 对象数组?
【发布时间】: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


【解决方案1】:

这样查询表

SELECT (r).* FROM (SELECT unnest(hobbie) AS r 
from person) AS hobbies;

它将爱好输出为一张桌子。 JDBC 翻译应该从那里直接进行。

【讨论】:

  • 你也可以使用(r).*
  • @a_horse_with_no_name 谢谢你,我完善了我的答案:)
  • 我认为这是正确的想法。无论如何,有一个更短的语法:select id, (unnest(hobbie)).* from person(也返回 ID,我认为这是在内存中创建关系所必需的)。
  • 感谢您的回答。它有效,我最终得到了相同的解决方案,但我想知道是否有一种方法可以在没有子查询和使用裸 jdbc 取消嵌套的情况下转换爱好。
  • @ArtemMalinko 如果有帮助,请接受我。再说一次——如果你想要实现的是自定义 OM,我强烈推荐 JOOQ,它允许你构建和运行你喜欢的任何查询,然后只需将结果绑定到任何 JPA 注释的 POJO 中。
猜你喜欢
  • 1970-01-01
  • 2023-03-19
  • 2021-09-09
  • 2011-10-03
  • 2023-03-31
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
  • 2020-12-19
相关资源
最近更新 更多