Map< String,String>spring数据jdbc中的单列映射 [英] Map<String, String> single column mapping in spring data jdbc

查看:69
本文介绍了Map< String,String>spring数据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&lt; String,String&gt;spring数据jdbc中的单列映射的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆