[英]How to map a List<String> with Hibernate/JPA WITHOUT an extra join table?
我问的问题很简单,但似乎不可能找到答案。 我正在使用 Spring Data JPA 并且我有一个 JDBC/JPA DataSource
(它是 PostgreSQL,但这无关紧要),它预先加载了数据,我只是想从中读取数据。
如何构建我的 POJO 以便我可以拥有一个不需要额外连接表的List<String>
字段? 这是我拥有的一个示例实体类:
@Entity
@Table(name = "pojo", schema = "pojoschema")
public class POJO {
@Id
@Column(name = "id", columnDefinition = "uuid")
private String id;
@Column(name = "a_string", columnDefinition = "text")
private String aString;
@Column(name = "strings", columnDefinition = "text[]")
@ElementCollection
private List<String> strings;
// getters/setters
}
这样做我得到一个org.postgresql.util.PSQLException: ERROR: relation "pojo_strings" does not exist
。
为什么 hibernate 认为我想要的String
在另一个表中? 如何解决此行为? 我只是想通过 JPA 将 PostgreSQL text[]
列映射回 POJO 中的List<String>
。
在这些情况下的方法是像这样使用 jpa 的AttributeConverter
:
@Converter
public class StringToListConverter implements AttributeConverter<List<String>, String> {
@Override
public String convertToDatabaseColumn(List<String> list) {
if(list == null) return "";
return String.join(",", list);
}
@Override
public List<String> convertToEntityAttribute(String joined) {
if(joined == null) return new ArrayList<>();
return new ArrayList<>(Arrays.asList(joined.split(",")));
}
}
并在您的实体字段中使用注释Converter
:
@Entity
@Table(name = "pojo", schema = "pojoschema")
public class POJO {
@Id
@Column(name = "id", columnDefinition = "uuid")
private String id;
@Column(name = "a_string", columnDefinition = "text")
private String aString;
@Column(name = "strings")
@Convert(converter = StringToListConverter.class)
private List<String> strings;
// getters/setters
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.