Map< String,String>spring数据jdbc中的单列映射 [英] Map<String, String> single column mapping in spring data jdbc
问题描述
我正在尝试使用Data JDBC映射一个具有Map字段的Resource类.这是简化的实体:
I'm trying to map a Resource class which has a Map field using Data JDBC. Here is simplified entity:
public class Resource {
@Id
private Long id;
private Map<String, String> props;
}
我不想为道具准备单独的表,而只为string类型的单列,或者为postgres设置为jsonb.
I don't want a separate table for props, just a single column of type string or may be jsonb for postgres.
我确实为地图类型注册了转换器,如下所示:
I did register converters for the map type like this:
@Configuration
public class DataJdbcConfiguration extends AbstractJdbcConfiguration {
@Override
public JdbcCustomConversions jdbcCustomConversions() {
return new JdbcCustomConversions(Arrays.asList(
JsonToStringConverter.INSTANCE,
StringToJsonConverter.INSTANCE)
);
}
@ReadingConverter
enum JsonToStringConverter implements Converter<String, Map<String, String>> {
INSTANCE;
@Override
public Map<String, String> convert(String source) {
try {
return new ObjectMapper().readValue(source, new TypeReference<Map<String, String>>() {
});
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
}
@WritingConverter
enum StringToJsonConverter implements Converter<Map<String, String>, String> {
INSTANCE;
@Override
public String convert(Map<String, String> source) {
try {
return new ObjectMapper().writeValueAsString(source);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return "";
}
}
}
插入工作正常,但是存储库上的 findAll
查询引发 org.springframework.data.mapping.MappingException:无法找到类型类java.lang.String的PersistentEntity!
Inserts are working fine but a findAll
query on the repository throws org.springframework.data.mapping.MappingException: Couldn't find PersistentEntity for type class java.lang.String!
推荐答案
Set
, List
和 Map
在Spring Data JDBC中得到特殊处理.我很惊讶通过 WritingConverter
持久地保留 Map
.
Set
, List
and Map
get special treatment in Spring Data JDBC.
I'm kind of surprised persisting the Map
via a WritingConverter
actually works.
我建议将地图替换为可能包裹 Map
的自定义类型.这样一来,就不会对地图进行任何特殊处理.
I recommend to replace the Map with a custom type which probably wraps the Map
.
This way any special handling of maps won't kick in.
当然可以在 https://jira.spring.io/browse/上将其作为功能请求提出DATAJDBC 始终是一个选项.
Of course raising this as a feature request on https://jira.spring.io/browse/DATAJDBC is also always an option.
这篇关于Map< String,String>spring数据jdbc中的单列映射的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!