【问题标题】:Get TEXT column value in psql获取 psql 中的 TEXT 列值
【发布时间】:2015-05-25 17:33:33
【问题描述】:

我用 Hibernate 创建了带有@Lob String 字段的简单实体。在 Java 中一切正常,但是我无法使用 psql 或 pgAdmin 直接检查 DB 中的值。

这是来自 DB 的定义:

=> \d+ user_feedback
                    Table "public.user_feedback"
 Column |  Type  | Modifiers | Storage  | Stats target | Description 
--------+--------+-----------+----------+--------------+-------------
 id     | bigint | not null  | plain    |              | 
 body   | text   |           | extended |              | 
Indexes:
    "user_feedback_pkey" PRIMARY KEY, btree (id)
Has OIDs: no

这是我从选择中得到的:

=> select * from user_feedback;
 id | body  
----+-------
 34 | 16512
 35 | 16513
 36 | 16514
(3 rows)

实际的“正文”内容是所有行的“普通”文本,绝对不是这些数字。

如何从 psql 中获取body 列的实际值?

【问题讨论】:

  • @Lob 是将数据保存为 clob 或 blob 的注释,说到 java 它应该是一个字节或字符数组,因此您在 postgresql I 的字段中保存有关该数组的一些信息不知道哪个值。尝试将您的注释更改为等效字符串。它应该工作。在此处查看参考:concretepage.com/hibernate/lob-hibernate-annotation

标签: java hibernate postgresql psql


【解决方案1】:

这会将 LOB 16512 的内容存储在文件 out.txt 中:

\lo_export 16512 out.txt

虽然这里通常不推荐使用@Lob(数据库备份问题...)。请参阅store-strings-of-arbitrary-length-in-postgresql 了解替代方案。

【讨论】:

  • 谢谢,我可以进入“我的内容” :) 我尝试使用通用解决方案,但是我会考虑您的建议,因为我不希望很快更改 postgresql。
【解决方案2】:

Hibernate 将值作为外部对象存储在 pg_largeobject 表中,并将 pg_largeobject 条目的对象 ID 存储在您的表中。见PostgreSQL manual - large objects。

听起来您希望改为内联字节数组 (bytea) 存储。如果是这样,您可能希望映射一个byte[] 字段没有@Lob 注释,而不是@Lob String。请注意,此更改将不向后兼容 - 您必须从数据库中导出数据,然后删除表并使用 Hibernate 的新定义重新创建它。

如何映射数据由 Hibernate 而非 PostgreSQL 选择。

查看相关:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 2017-03-21
    • 2016-04-30
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    相关资源
    最近更新 更多