什么Java库可以将PostgreSQL数组字面值映射到Java数组或列表?

4

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

例如,假设我想要将PostgreSQL数组字面量字符串转换为:

{ A, B, C }

将其转换为等效的Java List<String>Array<String>,其中包含{"A", "B", "C"}PostgreSQL JDBC driver是否有一个类方法可以执行此转换?

你找到任何解决方法了吗?我卡在同样的问题上。我的查询返回一个数组字面量,我需要解析它! - आनंद
3个回答

5
为什么要在Java中解析数组字符串字面量,当您可以从PgJDBC获取java.sql.Array并在其上调用getArray()以直接获得本机Java数组呢?
在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调用来解包值。


你提出了一个很好的观点。我在最初的问题中忽略了一点,即数组文字是包含在“hstore”列中的值之一。PgJDBC将hstore对象返回为Map<String, String>,在这种情况下,该值是数组文字。虽然此数组目前仅限于一维,但我希望解析多维数组。我可以编写解析器,但正如你所指出的那样,如果PgJDBC已经提供了解析器,则这可能会变得复杂和不必要。 - Derek Mahar
自定义解析器如果未来的PgJDBC版本更改了数组表示方式,也可能会变得脆弱。 - Derek Mahar
@DerekMahar的答案已经扩展,附带了建议的方法。 - Craig Ringer
除了我们已经在属性表中以这种方式存储这些数组之外,这肯定会起作用。为了避免每个属性的昂贵表连接,我一直在尝试使用hstore来看看如果将特定实体的所有属性移动到与其实体相同的行中的hstore列中,查询性能如何改善。将数组键转换回行有点违背了这个目的。 - Derek Mahar
1
@DerekMahar 是的,而且是的;新的 json 类型最初是作为 "hstore 2" 开始的。 - Craig Ringer
显示剩余3条评论

0

这篇PostgreSQL邮件列表文章描述了如何将Java数组保存到PostgreSQL数组列中。我需要做相反的事情:将一个PostgreSQL数组字面字符串转换为在使用psql查询数组列时看到的形式。 - Derek Mahar
我建议你看一下ActiveRecord。它可能会得到你想要的结果,并且可以节省你大量的工作。 - Josue Montano
@JosueMontano 嗯... ActiveRecord?Java?你是在想 ORM 吗 - 比如 Hibernate 或 EclipseLink 这样的 JPA 实现? - Craig Ringer
@Josue 你知道有没有一种ORM解决方案可以处理包含混合类型的文字字符串值集合(包括数组)的hstore列吗? - Derek Mahar

0

对于需要从逻辑复制(pgoutput)中解析数组值的人: 在这种情况下,使用 Craig Ringer 的答案中的 SQL 方法非常好/熟悉/高性能,因此我编写了一个来解析它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接