Convert list in entity to single string column in database

前端 未结 3 699
北荒
北荒 2020-12-01 09:30

I have a VARCHAR field in my database, and the value of this field is val1,val2,val3.

Is it possible to set this into an ArrayList&l

相关标签:
3条回答
  • 2020-12-01 09:34

    If you use JPA 2.1, then you can create an 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(",")));
      }
    
    }
    

    You can use this converter in your entity:

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

    For before JPA 2.1 you could do this by hand:

    @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);
      }
    }
    

    I wrap Arrays.asList in an ArrayList in the converter, because the result is stored in the attribute and any change to that list will be written back to the database - thus I need a changeable list (I can't add anything to the result of Arrays.asList). In the before 2.1 solution the result is not connected with the attribute and a changeable list would not be synchronized with the attribute.

    To query for an entity that contains a specific item in such an attribute, see my answer here

    0 讨论(0)
  • 2020-12-01 09:50

    Yes this is possible.

    With Hibernate 4.3.x+ you can define an AttributeConverter although I am pretty sure this will not work for early Hibernate versions because of the List type. See this for an example: http://www.thoughts-on-java.org/jpa-21-how-to-implement-type-converter/

    The other way to make this work is by implementing a custom UserType and annotating the field/getter with org.hibernate.annotations.Type. Here is a nice write up of this with examples: http://blog.xebia.com/understanding-and-writing-hibernate-user-types/

    Yet another way which is JPA compatible is to have two fields, the List annotated with javax.persistence.Transient and the String but then you have manage the state synchronization between these two field in PrePersist and PreUpdate listeners yourself. Here an example for using listeners: http://alexandregama.org/2014/03/23/entity-listeners-and-callback-methods-jpa/

    0 讨论(0)
  • 2020-12-01 09:52

    Try to use @ElementCollection and @CollectionTable annotations

    0 讨论(0)
提交回复
热议问题