当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《将实体中的列表转换为数据库中的单个字符串列》经验,为你挑选了2个好方法。

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

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



1> Tobias Liefk..:

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

@Converter
public class StringListConverter implements AttributeConverter, String> {

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

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

}

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

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

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

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

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

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

我裹Arrays.asListArrayList转换器中的,因为结果是存储在属性和任何改变这一名单将被写入到数据库中-因此,我需要一个多变的列表(我不能添加任何的结果Arrays.asList).在2.1之前的解决方案中,结果与属性无关,并且可更改列表不会与属性同步.

要查询包含此类属性中特定项的实体,请在此处查看我的答案



2> Christian Be..:

是的,这是可能的.

使用Hibernate 4.3.x +你可以定义一个AttributeConverter虽然我很确定这对早期的Hibernate版本不适用,因为它的List类型.请参阅此示例:http://www.thoughts-on-java.org/jpa-21-how-to-implement-type-converter/

实现此功能的另一种方法是实现自定义UserType并使用注释字段/ getter org.hibernate.annotations.Type.以下是一个很好的例子:http://blog.xebia.com/understanding-and-writing-hibernate-user-types/

JPA兼容的另一种方法是有两个字段,Listjavax.persistence.Transient和注释,String然后你自己管理这两个字段PrePersistPreUpdate监听器之间的状态同步.这里是一个使用监听器的示例:http://alexandregama.org/2014/03/23/entity-listeners-and-callback-methods-jpa/

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有