如何将一列大对象转换为长文本?

时间:2015-10-13 14:23:49

标签: java hibernate postgresql jpa spring-boot

我使用Spring Boot和Hibernate,JPA和PostgreSQL。我想将数据库大对象转换为文本内容。以前我在我的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替换为存储在大对象中的实际文本内容?

2 个答案:

答案 0 :(得分:2)

特别感谢@BohuslavBurghardt指点我this回答。为方便起见:

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

答案 1 :(得分:0)

我在Spring,Postgres和JPA(休眠)中也遇到了同样的问题。我有一个如下所示的有效负载字段

@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。