如果您使用 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);
}
}
I wrap Arrays.asList
in an ArrayList
在转换器中,因为结果存储在属性中,并且对该列表的任何更改都将写回数据库 - 因此我需要一个可更改的列表(我无法向结果添加任何内容)Arrays.asList
)。在里面2.1之前解决方案结果与属性不相关,并且可更改列表不会与属性同步。
要查询包含此类属性中的特定项目的实体,请参阅我的答案here /questions/50355913/jpql-query-for-item-in-list-stored-with-attributeconverter/50583780#50583780