You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Data Oracle NoSQL中@NosqlTable添加Map字段存储异常求助

问题:Oracle NoSQL Spring Data中Map字段存储异常

在Oracle NoSQL的@NosqlTable实体类中添加Map字段后,使用Spring Data保存时,Map被序列化为HashMap的内部结构而非预期的键值对形式。

实体类代码(Customer.java)

@NosqlTable(storageGB = 1, writeUnits = 10, readUnits = 10)
public class Customer {
        @NosqlId(generated = true)
        long customerId;
        String firstName;
        String lastName;
        Map hashMap;
        Date createdAt;

        @Override
        public String toString() {
            return "Customer{" +
               "customerId=" + customerId +
               ", firstName='" + firstName + '\'' +
               ", lastName='" + lastName + '\'' +
               ", createdAt='" + createdAt + '\'' +
               ", hashMap='" + hashMap + '\'' +
               '}';
        }
}

Repository代码(CustomerRepository.java)

import com.oracle.nosql.spring.data.repository.NosqlRepository;

public interface CustomerRepository
    extends NosqlRepository<Customer, Long>
{
    Iterable<Customer> findByLastName(String lastname);
}

保存数据代码

Customer s1 = new Customer();
s1.firstName = "John";
s1.lastName = "Doe";
HashMap s1Map = new HashMap() ;
s1Map.put("name", "myMap") ;
s1Map.put("use", true);
s1.hashMap = s1Map;

repo.save(s1);

异常存储结果

{
          "createdAt": null,
          "firstName": "John",
          "hashMap": {
                    "entrySet": null,
                    "keySet": null,
                    "loadFactor": 0.75,
                    "modCount": 2,
                    "size": 2,
                    "table": [
                              null,
                              null,
                              null,
                              null,
                              null,
                              null,
                              {
                                        "hash": 116102,
                                        "key": "use",
                                        "next": null,
                                        "value": true
                              },
                              null,
                              {
                                        "hash": 3373752,
                                        "key": "name",
                                        "next": null,
                                        "value": "myMap"
                              },
                              null,
                              null,
                              null,
                              null,
                              null,
                              null,
                              null
                    ],
                    "threshold": 12,
                    "values": null
          },
          "lastName": "Doe"
}
解决方案

问题根源在于两点:

  1. 未使用泛型类型:原始类型Map无法让Spring Data Oracle NoSQL识别键值对结构,导致序列化时解析了HashMap的内部属性。
  2. 缺少专属注解:需要给Map字段添加@NosqlMap注解,明确告知驱动该字段是键值对集合类型。

修改后的Customer实体类代码:

@NosqlTable(storageGB = 1, writeUnits = 10, readUnits = 10)
public class Customer {
        @NosqlId(generated = true)
        long customerId;
        String firstName;
        String lastName;
        // 指定泛型并添加@NosqlMap注解
        @NosqlMap
        Map<String, Object> hashMap;
        Date createdAt;

        @Override
        public String toString() {
            return "Customer{" +
               "customerId=" + customerId +
               ", firstName='" + firstName + '\'' +
               ", lastName='" + lastName + '\'' +
               ", createdAt='" + createdAt + '\'' +
               ", hashMap='" + hashMap + '\'' +
               '}';
        }
}

修改后存储的结果会变为预期的键值对结构:

{
          "createdAt": null,
          "firstName": "John",
          "hashMap": {
                    "name": "myMap",
                    "use": true
          },
          "lastName": "Doe"
}

如果Map的键值是特定类型(比如Map<String, String>),可以明确指定泛型类型,让序列化和反序列化逻辑更严谨。

内容的提问来源于stack exchange,提问作者user3346812

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 09:10:44