string - 将实体中的列表转换为数据库中的单个字符串列

标签 string hibernate arraylist

我有一个VARCHAR我的数据库中有一个字段,该字段的值为 val1,val2,val3

是否可以将其设置为 ArrayList<String>使用逗号作为分割分隔符的实体属性?

最佳答案

如果您使用 JPA 2.1,那么您可以创建一个 AttributeConverter:

@Converter
public class StringListConverter implements AttributeConverter<List<String>, String> {

  @Override
  public String convertToDatabaseColumn(List<String> list) {
    // Java 8
    return String.join(",", list); 
    // Guava
    return Joiner.on(',').join(list); 
  }

  @Override
  public List<String> convertToEntityAttribute(String joined) {
    return new ArrayList<>(Arrays.asList(joined.split(",")));
  }

}

您可以在您的实体中使用此转换器:

@Column
@Convert(converter = StringListConverter.class)
private List<String> strings;

对于 JPA 2.1 之前的版本,您可以手动执行此操作:

@Entity
private MyEntity {
  ...
  private String strings;

  public List<String> getStrings() {
    return Arrays.asList(strings.split(","));
  }

  public void setStrings(List<String> list) {
    strings = String.join(",", list);
  }
}

我将 Arrays.asList 包装在转换器的 ArrayList 中,因为结果存储在属性中,并且对该列表的任何更改都将写回数据库- 因此我需要一个可更改的列表(我无法向 Arrays.asList 的结果添加任何内容)。在2.1之前的解决方案中,结果不与属性关联,并且可更改列表不会与属性同步。

要查询包含此类属性中的特定项目的实体,请参阅我的答案 here

关于string - 将实体中的列表转换为数据库中的单个字符串列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34048978/

相关文章:

java - 搜索字符数组列出某个字符

ruby - 测试字符串是以另一个字符串开头还是以另一个字符串结尾

Python2,检查字符串是否只包含数字,与 x.isdigit() 混淆

mysql - 比较 MySQL 中的两个 ISO 日期时间字符串

java - 使用 JPA 先由父级排序,然后由子级排序

java - 为什么 Hibernate 使用序列

java - 迭代并从 ArrayList 中删除元素时如何避免 java.util.ConcurrentModificationException

C++/'string' 未在此范围/错误中声明

java - hibernate 。乐观锁。选择版本,即使它生成它

java - 为什么重置我的适配器不使用新的 ArrayList?