gpt4 book ai didi

java - 在 Java 中从 PostgreSQL 检索 xml 数组

转载 作者:行者123 更新时间:2023-11-29 13:40:59 26 4
gpt4 key购买 nike

为了检索具有 XML 字段的样本,我使用了以下代码:

    String my_call = "CALL my_proc(?)";
PreparedStatement ps = connection.prepareStatement(my_call);
ps.setSQLXML(1, null);
ResultSet rs = ps.executeQuery();
rs.next()
SQLXML desc = rs.getSQLXML(1);
// use desc

这很完美。

但是另一个过程返回一个 XML 数组。我尝试了以下代码,但没有成功:

String my_call = "CALL my_other_proc(?)";
Array xml = connection.createArrayOf("xml", new Object[]{}); // what's wrong here ?
PreparedStatement ps = connection.prepareStatement(my_call);
ps.setArray(1, xml);
ResultSet rs = ps.executeQuery();
rs.next();
Array xml_array = rs.getArray(1);
SQLXML[] sqlxmls = (SQLXML[])xml_array.getArray(); // what's wrong here ?

我收到以下错误:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.sql.SQLXML;

最佳答案

对于数组,当前不支持 UUID(通过 ArrayAssistant)和 JSONB(返回为 String)以外的自定义类型。

但是,您可以使用 String 来解决这个问题,例如:

Array xml_array = rs.getArray(1);
Object[] sqlxmls = (Object[]) xml_array.getArray();
for (Object o : sqlxmls) {
PGobject pgValue = PGobject.class.cast(o);
SQLXML xml = conn.createSQLXML();
xml.setString(pgValue.getValue());
StreamSource source = xml.getSource(StreamSource.class);
// ...
}

有关更多详细信息,请查看 PgArray.buildArray(...) 的代码.

这也适用于语句参数。不要使用标准的 JDBC SQLXML 对象,只需使用 String[] 作为参数,例如:

List<String> docs = new ArrayList<>();
for (int i = 0; i < 5; i++) {
docs.add("<test index=\"" + (i + 1) + "\"><property value=\"true\"/></test>");
}

Array docsArray = conn.createArrayOf("XML", docs.toArray());
try (PreparedStatement stmt = conn.prepareStatement("INSERT INTO t_array_xml (id, docs) VALUES (?, ?);")) {
stmt.setInt(1, 1);
stmt.setArray(2, docsArray);
stmt.executeUpdate();
}
docsArray.free();

关于java - 在 Java 中从 PostgreSQL 检索 xml 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55442683/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com