Jeśli używasz JPA 2.1, można tworzyć 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(",")));
}
}
Można używać tego konwertera w swojej jednostki:
@Column
@Convert(converter = StringListConverter.class)
private List<String> strings;
Dla zanim JPA 2.1 można to zrobić ręcznie :
@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 owinąć Arrays.asList
w ArrayList
w CON verter, ponieważ wynik jest przechowywany w atrybucie i każda zmiana na tej liście zostanie zapisana z powrotem do bazy danych - potrzebuję zatem listy wymiennej (nie mogę dodać niczego do wyniku Arrays.asList
). W przypadku rozwiązania przed wynikiem 2.1 wynik nie jest połączony z atrybutem, a zmienna lista nie byłaby zsynchronizowana z atrybutem.