Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java在SQL Server中持久化大型JSON字符串_Java_Sql Server_Json_String_Hibernate - Fatal编程技术网

如何使用Java在SQL Server中持久化大型JSON字符串

如何使用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

我有一个非常大的JSON字符串,我需要存储在数据中,非常大的意思是超过48000个字符,我使用SQL server将此数据存储在
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
将JSON列映射为字符串实体属性 映射JSON列最灵活的方法是使用由

将JSON列映射为POJO实体属性 您不限于使用字符串实体属性。考虑到POJO属性与JSON属性匹配,您也可以使用POJO:

这一次,properties entity属性将映射如下:

<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巨大的: