Spring Data Jdbc - 将内部类映射到表列

Bre*_*t Y 2 spring spring-data spring-boot spring-data-jdbc

使用Spring Data JDBC我希望将内部变量“inner”映射到外部表中的 varchar 列,而不是映射到它自己的表。这可能吗?

public class Outer {
    @Id
    private String id;
    private Inner inner;
}

...

public class Inner {
   private String value;
}

...

public OuterRepository implements CrudRepository<Outer, String> {}
Run Code Online (Sandbox Code Playgroud)

这是我的上下文配置:

@Configuration
@EnableJdbcRepositories
public class Config extends JdbcConfiguration {

    @Bean
    protected JdbcCustomConversions jdbcCustomConversions() {
        return new JdbcCustomConversions(asList(StringToInner.INSTANCE, InnerToString.INSTANCE));
    }

    @WritingConverter
    enum InnerToString implements Converter<Inner, String> {

        INSTANCE;

        @Override
        public String convert(Inner source) {
            return source.getValue();
        }
    }

    @ReadingConverter
    enum StringToInner implements  Converter<String, Inner> {

        INSTANCE;

        @Override
        public Inner convert(String source) {
            return new Inner(source);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jen*_*der 5

是的,这是可能的。你需要从提供转换器InnerString和背部。

在您的应用程序上下文配置中注册一个 bean jdbcCustomConversions

@Bean
CustomConversions jdbcCustomConversions() {
    return new JdbcCustomConversions(asList(InnerToString.INSTANCE, StringToInner.INSTANCE));
}
Run Code Online (Sandbox Code Playgroud)

定义引用的转换器如下:

@WritingConverter
enum InnerToString implements Converter<Inner, String> {

    INSTANCE;

    @Override
    public String convert(Inner inner) {

        return inner == null ? null : inner.value;
    }
}

@ReadingConverter
enum StringToInner implements Converter<String, Inner> {

    INSTANCE;

    @Override
    public Inner convert(String source) {

        Inner inner = new inner();
        inner.value = source;
        return inner;
    }
}
Run Code Online (Sandbox Code Playgroud)

转换器不必是枚举,但只要转换器未参数化,拥有多个实例就没有意义。

注释@WritingConverter@ReadingConverter很重要,因为它们控制在写入数据库或数据库读取时是否使用转换器。

请注意,这适用于存储在单个列中的类。尚不支持映射到列列表的正确嵌入实体。请参阅DATAJDBC-111