PostgreSQL:以非编程方式(使用工具)选择大型对象(如文本)

PostgreSQL:以非编程方式(使用工具)选择大型对象(如文本),postgresql,jdbc,Postgresql,Jdbc,我们正在使用带有JPA的PostgreSQL,它将大字符串映射到类型为TEXT的列 虽然我们可以通过编程读取和写入数据,但当我选择数据时,pgAdmin和psql只显示对象ID 是否有一种方法/工具可以在不使用某些API(例如JDBC)的情况下快速选择数据 例如: doi=> \d+ xmlsnippet; Table "doi.xmlsnippet" Column | Type | M

我们正在使用带有JPA的PostgreSQL,它将大字符串映射到类型为
TEXT
的列

虽然我们可以通过编程读取和写入数据,但当我选择数据时,pgAdmin和psql只显示对象ID

是否有一种方法/工具可以在不使用某些API(例如JDBC)的情况下快速选择数据

例如:

doi=> \d+ xmlsnippet;
                           Table "doi.xmlsnippet"
    Column    |          Type          | Modifiers | Storage  | Description 
--------------+------------------------+-----------+----------+-------------
 dbid         | bigint                 | not null  | plain    | 
 version      | bigint                 | not null  | plain    | 
 datasnippet  | text                   |           | extended | 
 doi          | character varying(255) |           | extended | 
 doipool_dbid | bigint                 |           | plain    | 
datasnippet
包含一些大字符串(带有XML代码)

当我选择它时,我得到

doi=> select * from xmlsnippet;
 dbid  | version | datasnippet |           doi            | doipool_dbid 
-------+---------+-------------+--------------------------+--------------
    43 |       0 | 282878      | 10.3929/ethz-a-000077127 |           13
    44 |       0 | 282879      | 10.3929/ethz-a-000085677 |           13
    45 |       0 | 282880      | 10.3929/ethz-a-000085786 |           13
    46 |       0 | 282881      | 10.3929/ethz-a-000087642 |           13
    47 |       0 | 282882      | 10.3929/ethz-a-000088898 |           13

                   ^^^^^^^
编辑:如果我使用JDBC执行相同的查询,我会得到预期的内容(我存储在列中的文本)

可能是一个“常见疑点”(即JPA/Hibernate/PostgreSQL JDBC驱动程序)将列映射到PostgreSQL的“大对象”系统中

psql
shell中的快速测试:

db=> \lo_export 282878 /tmp/x.txt
lo_export
将示例中第一个id引用的内容导出到文件
/tmp/x.txt
。用编辑器检查它。告诉我们这是不是你的数据

如果这种映射真的发生了,那么您就有一个维护问题——大型对象必须手动删除,并且还有一些其他固有的缺点。但这是另一个故事。

在pgAdmin III中,我使用:

select dType, id, loread(lo_open(docxml::::int, 131072), 999999999) from XmlPadraoNFe

请参阅:

文本类型的列应该包含文本本身,而不是对内容的引用。在上面显示的select*中,很明显,datasnippet列被误用来存储对真实文本的引用,而真实文本可能存储在其他地方,可能存储在不同的表中。如果这个理论是正确的,你找到了那张表,您可以将它连接到xmlsnippet并创建一个视图,该视图将输出xmlsnippet.*以及您感兴趣的文本。@DanielVérité问题是没有其他表,如果我从xmlsnippet中选择datasnippet,例如使用JDBC,我将在没有任何显式连接的情况下获取数据并写入数据。@Matteo:您要么没有向我们显示正确的表定义,要么正在从JDBC应用程序连接到不同的数据库。文本列不是“大对象”,也不包含“对象id”,除非您自己将其存储在其中。有没有可能JPA在那里发挥了某种“魔力”?好的,我得到了数据。然后我将尝试更改映射。我只是被表定义没有显示任何内容的事实弄糊涂了。事实上,很难看出282878是
TEXT
列的内容还是大型对象的ID。这是这里发生的奇怪事情之一。我还希望至少有一个数字列类型(
oid
integer
,…),而不是
text
。是的,我也这么想,因此我的问题是:-)