JPA:将值列表保存为逗号分隔值

时间:2015-11-06 16:59:50

标签: java hibernate jpa

我收到一个简单的值列表,它是JSON请求的一部分,我想将其保存为逗号分隔值。尝试使用以下但是没有用。

@Column(nullable = true)
@GeneratedValue(strategy = GenerationType.AUTO)
private ArrayList<String> services = new ArrayList<String>() ;

@Column(nullable = true)
@ElementCollection(targetClass = String.class)
private List<String> services = new ArrayList<String>() ;

@ElementCollection提出异常table services does not exist

2 个答案:

答案 0 :(得分:3)

@ElementCollection需要一个表来存储多行值,

所以你可以定义为String列并在getter和setter中加入/爆炸,就像这样

private String services;

public setServices(String services[]) //Can be Array or List
{
     // this.services = Iterate services[] and create a comma separated string or Use ArrayUtils
}

public String[] getServices() //Can be Array or List
{
    // services.split(",") to get a list of Strings, then typecast/parse them to Strings before returning or use Arrays.asList(arguments.split(","));
}

答案 1 :(得分:2)

正如其他人在评论中所提到的,AttributeConverter效果很好。这个使用Jackson序列化为JSON数组。我推荐JSON,因为它干净地处理分隔符转义,空值,引号等:

public class StringListAttributeConverter implements AttributeConverter<List<String>, String> {

    private static final TypeReference<List<String>> TypeRef = new TypeReference<List<String>>(){};

    @Override
    public String convertToDatabaseColumn (List<String> attribute) {
        if (attribute == null) {
            return null;
        }
        try {
            return ObjectMapperFactory.getInstance().writeValueAsString(attribute);
        }
        catch (IOException ex) {
            throw new UncheckedIOException(ex);
        }
    }

    @Override
    public List<String> convertToEntityAttribute (String dbData) {
        if (dbData == null) {
            return null;
        }
        try {
            return ObjectMapperFactory.getInstance().readValue(dbData, TypeRef);
        }
        catch (IOException ex) {
            throw new UncheckedIOException(ex);
        }
    }
}

我已经使用过这个课程,但在大多数情况下它运作良好。我发现一个警告是使用这个转换器可能会混淆一些JPA条件查询,因为它需要实体上的类型List,但在db中找到一个String。