【问题标题】:How do I convert a column of large objects to long text?如何将一列大对象转换为长文本?
【发布时间】:2016-01-11 08:30:30
【问题描述】:

我正在使用带有 Hibernate、JPA 和 PostgreSQL 的 Spring Boot。我想将数据库大对象转换为文本内容。以前我在我的 JPA 实体中将我的长文本定义为@Lob

@Lob
String description;

然后我发现使用@Lob 经常会产生问题,并决定将它们改为:

@Type(type="org.hibernate.type.StringClobType")
String description;

在数据库中以文本类型表示。不幸的是,现在以前的大对象的参考编号(oid's)存储在我的行中,而不是实际的内容。例如:

id | description
---------------------
 1 | 463784           <- This is a reference to the object rather than the content

代替:

id | description
---------------------
 1 | Once upon a time, in a galaxy...

我的问题是,现在我们的数据库中有数千行数据,我该如何编写函数或执行查询,将大对象的 id 替换为大对象中存储的实际文本内容?

【问题讨论】:

标签: java hibernate postgresql jpa spring-boot


【解决方案1】:

特别感谢@BohuslavBurghardt 将我指向this 答案。为了您的方便:

UPDATE table_name SET column_name = lo_get(cast(column_name as bigint))

【讨论】:

  • 我在使用 Spring、Postgres 和 JPA (Hibernate) 时遇到了同样的问题。
【解决方案2】:

我需要一些额外的转换:

UPDATE table_name SET text_no_lob = convert_from(lo_get(text::oid), 'UTF8');

【讨论】:

    【解决方案3】:

    我在使用 Spring、Postgres 和 JPA(Hibernate)时遇到了同样的问题。我有一个如下所示的有效负载字段

    @NotBlank
    @Column(name = "PAYLOAD")
    private String payload;
    

    我想将数据类型更改为 文本 以支持大数据。所以我使用了@Lob,我得到了同样的错误。为了解决这个问题,我首先更改了我的实体中的字段,如下所示:

    @NotBlank
    @Column(name = "PAYLOAD")
    @Lob
    @Type(type = "org.hibernate.type.TextType")
    private String payload;
    

    由于我在此列中的数据是一些标量(数字),我已在 Postgres 中使用以下命令将其更改为普通文本:

     UPDATE MYTABLE SET PAYLOAD = lo_get(cast(PAYLOAD as bigint))
    

    非常感谢@Sipder。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-20
      • 2020-06-25
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      • 2019-09-13
      • 2022-01-10
      相关资源
      最近更新 更多