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

在JHipster中处理非实体类集合的最优方案是什么?

在JHipster中处理非实体类集合的最优方案

我们正在对接第三方REST API,大量接口响应的JSON数据包含JSON数组,最常见的就是字符串数组。为了在关系型数据库中存储这类结构的数据,需要进行数据转换,目前的示例实现如下:

public class StringListConverter implements AttributeConverter<List, String> {

  @Override
  public String convertToDatabaseColumn(List<String> strings) {
    if (strings == null) {
        return null;
    }

    return String.join(",", strings);
  }

  @Override
  public List<String> convertToEntityAttribute(String joinedStrings) {
    if (joinedStrings == null) {
        return null;
    }

    return Arrays.asList(joinedStrings.split(","));
  }
}

@Entity
public class Foo {

  @Convert(converter = StringListConverter.class)
  private List<String> strings;
  // 其他属性及方法省略
}

将此类集合数据转换为多对一关系,把字符串列表当作实体类列表来处理完全没有意义。

据了解,JHipster没有开箱即用的非实体类集合处理方式,因此想请教在JHipster中处理这类场景的最优方案是什么?


更新:JSON数据处理方案参考

根据GaeL的建议,我咨询后得到三种基于Spring Data JPA的JSON数据存储方案,具体如下:

方案一:直接存储JSON字符串到PostgreSQL的JSONB列

以下是使用Spring Data JPA将JSON数据保存到PostgreSQL的步骤:

  1. 创建PostgreSQL数据库及包含JSON列的表,创建Spring Boot项目并在pom.xml中添加对应依赖;
  2. 创建包含JSONB类型属性的Java实体类;
  3. 创建继承CrudRepository的仓库接口,提供数据增删改查方法;
  4. 配置数据库连接,在应用中通过仓库实例保存JSON数据。

示例代码:

@Entity
public class Person {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @JSONB
  private String data;

  public Person() {
  }

  public Person(String data) {
    this.data = data;
  }

  // Getter和Setter方法
  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getData() {
    return data;
  }

  public void setData(String data) {
    this.data = data;
  }
}

public interface PersonRepository extends CrudRepository<Person, Long> {}

// 保存数据示例
Person person = new Person("{\"name\": \"John Doe\", \"age\": 30}");
personRepository.save(person);

JSON数据会被保存到Person表的data列中,后续可直接查询获取该JSON数据。

方案二:使用自定义Converter转换JSON与Map结构

示例代码:

@Entity
public class Customer {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  private String name;

  @Convert(converter = JsonToMapConverter.class)
  private Map<String, String> info;
  // 其他属性及方法省略
}

public class JsonToMapConverter implements 
AttributeConverter<Map<String, String>, String> {

  @Override
  public String convertToDatabaseColumn(Map<String, String> attribute) {
    return JSON.toJSONString(attribute);
  }

  @Override
  public Map<String, String> convertToEntityAttribute(String dbData) {
    return JSON.parseObject(dbData, Map.class);
  }
}

// 保存与查询示例
Customer customer = new Customer("John Doe", new HashMap<>(Map.of("age", "30", "country", "USA")));
customerRepository.save(customer);

Customer customer = customerRepository.findById(1L).get();
Map<String, String> info = customer.getInfo();
System.out.println(info);

方案三:直接映射自定义对象/集合到JSONB列

对于单个自定义对象:

@Entity
@Table(name = "users")
public class User {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @Column(columnDefinition = "jsonb")
  private UserInfo userInfo;

  public User() {
  }

  public User(UserInfo userInfo) {
    this.userInfo = userInfo;
  }
  // 其他属性及方法省略
}

// 保存数据示例
User user = new User(new UserInfo("John Doe", "john.doe@example.com"));
userRepository.save(user);

对于JSON数组(字符串列表或自定义对象列表),只需采用相同思路:

@Entity
@Table(name = "users")
public class User {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @Column(columnDefinition = "jsonb")
  private List<String> phoneNumbers;

  @Column(columnDefinition = "jsonb")
  private List<UserInfo> userInfoList;

  public User() {
  }

  public User(List<String> phoneNumbers, List<UserInfo> userInfoList) {
    this.phoneNumbers = phoneNumbers;
    this.userInfoList = userInfoList;
  }
  // 其他属性及方法省略
}

// 保存数据示例
User user = new User(
    Arrays.asList("123-456-7890", "987-654-3210"),
    Arrays.asList(new UserInfo("John Doe", "john.doe@example.com"), new UserInfo("Jane Doe", "jane.doe@example.com"))
);
userRepository.save(user);    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 16:14:57