3

哪些第三方 Java 类库可用于将PostgreSQL 数组文字字符串映射到 Java 数组或字符串列表?

例如,假设我希望转换一个 PostgreSQL 数组文字字符串,例如

{ A, B, C }

进入等效的 JavaList<String>Array<String>包含{ "A", "B", "C" }. PostgreSQL JDBC 驱动程序是否有一个类方法来执行这种转换?

4

3 回答 3

5

java.sql.Array当您可以从 PgJDBC中获取 a 并调用它以直接获取本机 Java 数组时,为什么要在 Java 中解析数组字符串文字getArray()

在 Java 中解析数组文字似乎是一种不必要的复杂方法。

由于您从 获取值作为数组文字hstore,我想说您有一点数据模型设计问题,因为 hstore 实际上只存储字符串值,因此存储数组文字有点难看。我可以理解,在某些情况下它可能是可取的,至少在 Pg 获得改进的json支持之前。

在这种情况下,我会让 PostgreSQL 为您解析数组文字。给定设置:

regress=# CREATE EXTENSION hstore;
CREATE EXTENSION
regress=# CREATE TABLE hstoretest ( test hstore );
CREATE TABLE
regress=# INSERT INTO hstoretest(test) VALUES ( hstore( ARRAY['a', 'b'], ARRAY[ ARRAY[1,2,3]::text, ARRAY[9,8,7]::text ] ) );
INSERT 0 1
regress=# INSERT INTO hstoretest(test) VALUES ( hstore( ARRAY['a', 'b'], ARRAY[ ARRAY[11,12,13]::text, ARRAY[99,88,77]::text ] ) );
INSERT 0 1
regress=# SELECT * FROM hstoretest ;
                 test                 
--------------------------------------
 "a"=>"{1,2,3}", "b"=>"{9,8,7}"
 "a"=>"{11,12,13}", "b"=>"{99,88,77}"
(2 rows)

您可以让 Pg 为您扩展和解析数组文字,例如:

regress=# SELECT k, fetchval(test,k)::integer[] FROM (SELECT test, skeys(test) AS k FROM hstoretest) withkeys;
 k |  fetchval  
---+------------
 a | {11,12,13}
 b | {99,88,77}
 a | {1,2,3}
 b | {9,8,7}
(4 rows)

您可能需要或多或少复杂的变体,具体取决于您是仅获取一个 hstore 字段还是多个字段,您的所有值是否都是相同类型的数组等。在某些情况下,您需要执行单独的 SQL 调用解包值。

于 2013-04-20T10:26:29.430 回答
0

是的,它有。看看:http ://www.postgresql.org/message-id/49107A7D.3050206@gmail.com 。这里还有一篇有趣的文章。那篇文章有一个评论链接到 GitHub (sproc-spring-mapper) 上一个有趣的项目。

于 2013-04-19T15:29:32.233 回答
0

对于谁需要从逻辑复制(pgoutput)中解析数组值:在这种情况下,在Craig Ringer的回答中使用sql方式非常好/熟悉/高性能,所以我写了一个来解析它。

于 2020-11-12T01:25:55.580 回答