gpt4 book ai didi

java - 如何使用复合类型数组调用 postgres 函数

转载 作者:行者123 更新时间:2023-11-29 12:25:04 27 4
gpt4 key购买 nike

我正在寻找有关如何调用参数为复合类型数组的 postgres 函数的建议。有人问过类似的问题,但我找到了满意的答案。

我有以下复合类型:

CREATE TYPE collect.event_record AS (
event_type integer
, event_timestamp timestamp without time zone
, event_data text
, event_import_id integer
);

我有以下功能:

CREATE OR REPLACE FUNCTION collect.insert_events(
fail_on_duplicates boolean,
source_public_id text,
event_records collect.event_record[])
RETURNS integer AS
...

在 postgres 方面,一切似乎都运行良好。现在我只需要从 java/kotlin 调用它。

我们使用这个版本的 postgres 驱动:

compile group: "org.postgresql", name: "postgresql", version: "9.4.1212"

PreparedStatement 上有一个方法似乎是我正在寻找的方法:

void setArray (int parameterIndex, Array x) throws SQLException;

数组类型是 java.sql.Array 据我所知可以使用 Connection 对象创建它:

Array createArrayOf(String typeName, Object[] elements) throws SQLException;

但是,在这里我不确定要输入什么。typeName 应该是什么?我想我应该创建一个与复合类型匹配的类,并根据需要序列化字段,或者它是一个 java.sql.Struct 数组。

我一直在谷歌上搜索示例,但它们似乎主要处理原始类型,这对我的情况没有帮助。

另一种方法是重构 insert_events 以接受多个原始类型数组,类似于我的对象的列 View 。

另一种方法是发送一个 JSON 数组,我将其转换为 postgres 函数内的 collect.event_record[] 数组。

但是,我想找到一种方法来保留我目前拥有的 postgres 函数签名。

非常感谢任何想法。

最佳答案

据我所知,Postgres jdbc 驱动程序不支持 Struct,但对于复合类型的数组还有另一种解决方法。文档 says可以使用以下结构创建复合类型的实例:(value_of_event_type,value_of_event_timestamp,value_of_event_data,value_event_import_id)event_record 数据结构可以定义如下:

data class EventRecord(
val eventType: Int,
val eventTimestamp: Instant,
val eventData: String,
val eventImportId: Int) {

fun toSqlRow(): String {
return ("(" + eventType + ","
+ eventTimestamp + ","
+ eventData + ","
+ eventImportId +
")")
}
}

下一步是创建PreparedStatement:

val preparedStatement = con.prepareStatement("SELECT * FROM public.insert_events(?, ?, ?)")
// ... define other parameters
preparedStatement.setArray(3, con.createArrayOf("public.event_record", records.map { e -> e.toSqlRow() }.toTypedArray()))

创建的PreparedStatement可用于查询数据库。

PS:当前的实现不适用于包含 "' 的文本值。如果需要,请将文本值括在引号中包含 , 并将 " 替换为 \"

关于java - 如何使用复合类型数组调用 postgres 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44697815/

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