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
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…