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

我的数据库中有一个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中,因为结果存储在属性中,对该列表的任何更改都将写回数据库 – 因此我需要一个可更改的列表(我无法在结果中添加任何内容) of Arrays.asList).在2.1之前的解决方案中,结果与属性无关,并且可更改列表不会与属性同步.

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

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03