如何使用Java在SQL Server中持久化大型JSON字符串
我有一个非常大的JSON字符串,我需要存储在数据中,非常大的意思是超过48000个字符,我使用SQL server将此数据存储在如何使用Java在SQL Server中持久化大型JSON字符串,java,sql-server,json,string,hibernate,Java,Sql Server,Json,String,Hibernate,我有一个非常大的JSON字符串,我需要存储在数据中,非常大的意思是超过48000个字符,我使用SQL server将此数据存储在text类型的字段中,然后我尝试将其更改为nvarchar(max),但似乎没有什么区别 在数据库中插入40000个字符后,字符串出现的问题被截断。我使用hibernate将数据存储在特定列中,并将其映射为java.lang.String 下面是我从object转换为jsonobject的代码 public static JSONObject toJSONListWit
text
类型的字段中,然后我尝试将其更改为nvarchar(max)
,但似乎没有什么区别
在数据库中插入40000个字符后,字符串出现的问题被截断。我使用hibernate将数据存储在特定列中,并将其映射为java.lang.String
下面是我从object转换为jsonobject的代码
public static JSONObject toJSONListWithKey(List<?> object, String key) {
JSONObject jsonObject = new JSONObject();
JSONArray jsonArray = new JSONArray();
Gson gson = new Gson();
try {
for (Object object2 : object) {
jsonArray.put(new JSONObject(gson.toJson(object2)));
}
if (null != key || !"".equals(key)) {
jsonObject.put(key, jsonArray);
} else {
jsonObject = new JSONObject(jsonArray.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
return jsonObject;
}
有谁能建议/指导我哪里出了问题,如果这种方法不正确,我应该采取什么措施?您可能需要修改
ins
映射,因此reportJson
列允许使用更大的字符串,甚至可能将类型更改为TEXT
。如果正在使用XML文件进行映射配置,则可以如下所示指定列类型:
<property name="reportJson" >
<column name="reportJson" sql-type="TEXT"/>
</property>
@Type(type = "json")
private BookProperties properties;
您可能会发现另一个问题很有帮助:
实际上,您可以使用开源项目轻松地将JSON列类型映射到JPA实体 现在,假设您有以下数据库表:
CREATE TABLE book (
id BIGINT NOT NULL PRIMARY KEY,
isbn VARCHAR(15),
properties NVARCHAR(4000) CHECK(
ISJSON(properties) = 1
)
)
您可以通过两种方式映射JSON属性
列:
- 作为Java
字符串
- 作为一个POJO
<property name="reportJson" >
<column name="reportJson" sql-type="TEXT"/>
</property>
@Type(type = "json")
private BookProperties properties;
使用POJO而不是基于字符串的JSON属性可以简化应用程序端的读写操作
请注意,由于实体和POJO类都使用了Fluent样式的API,我们可以很好地构建Book实体实例:
entityManager.persist(
new Book()
.setId(1L)
.setIsbn("978-9730228236")
.setProperties(
new BookProperties()
.setTitle("High-Performance Java Persistence")
.setAuthor("Vlad Mihalcea")
.setPublisher("Amazon")
.setPrice(44.99D)
)
);
在持久化上述实体时,Hibernate会生成正确的SQL INSERT语句:
INSERT INTO book (
isbn,
properties,
id
)
VALUES (
'978-9730228236',
'{
"title": "High-Performance Java Persistence",
"author": "Vlad Mihalcea",
"publisher": "Amazon",
"price": 44.99
}',
1
)
UPDATE
book
SET
properties =
'{
"title": "High-Performance Java Persistence",
"author": "Vlad Mihalcea",
"publisher": "Amazon",
"price": 44.99,
"url": "https://amzn.com/973022823X"
}'
WHERE
id = 1
使用POJO时,更改properties entity属性也要简单得多:
Book book = entityManager
.unwrap(Session.class)
.bySimpleNaturalId(Book.class)
.load("978-9730228236");
book.getProperties().setUrl(
"https://amzn.com/973022823X"
);
通过更新JSON实体属性,Hibernate生成正确的SQL UPDATE语句:
INSERT INTO book (
isbn,
properties,
id
)
VALUES (
'978-9730228236',
'{
"title": "High-Performance Java Persistence",
"author": "Vlad Mihalcea",
"publisher": "Amazon",
"price": 44.99
}',
1
)
UPDATE
book
SET
properties =
'{
"title": "High-Performance Java Persistence",
"author": "Vlad Mihalcea",
"publisher": "Amazon",
"price": 44.99,
"url": "https://amzn.com/973022823X"
}'
WHERE
id = 1
字符串不能映射到文本数据类型吗?当前是这样的:
默认情况下,字符串映射为VARCHAR。如果您没有为它指定一个长度,它可能是一个默认长度,不适合您当前的需要。您可以使用当前配置指定它,如下所述:您需要更改的是SQL列的类型,而不是Java类型。它仍然是一个字符串,但在数据库中它将被映射为文本。我不想指定我的列的长度,因为它可能会有所不同。实际上,未指定的列可以更长或更短,因为它是在运行时生成的,在这种情况下,我应该为文本数据类型指定最大长度吗?如果将字段映射到SQL文本类型,则无需指定任何长度。根据这一点:,它将把您的字段映射为一个SQL CLOB,它被设计为巨大的,比如2GB巨大的: