将 jooq 记录映射到 Immutables

问题描述 投票:0回答:1

有一个很好的选择,可以自动、类型安全地将 jooq 结果映射到 Java POJO,例如使用 Java 16 记录此处描述

我想使用通过 Immutables 库 创建的对象。 我可以使用 @Parameter 注释创建工厂方法,它工作得很好

@Value.Immutable
public interface Author {
    @Value.Parameter
    int id();

    @Value.Parameter
    String firstName();

    @Value.Parameter
    Optional<String> lastName();
    
    @Value.Parameter
    Book[] books();
}

@Value.Immutable
public interface Book {
    @Value.Parameter
    int id();

    @Value.Parameter
    int title();
}

和查询

create.select(
         AUTHOR.ID,
         AUTHOR.FIRST_NAME, 
         AUTHOR.LAST_NAME,
         array(
           select(row(BOOK.ID, BOOK.TITLE).mapping(Book.class, ImmutableBook::of))
           .from(BOOK)
           .where(BOOK.AUTHOR_ID.eq(AUTHOR.ID)
         )
       )
      .from(AUTHOR)
      .fetch(Records.mapping(ImmutableAuthor::of));

但是当某些参数可为空时就会出现问题 - lastName 在这种情况下,作为工厂方法 of() 需要 Optional.empty() 作为可空字段。

java jooq immutables-library
1个回答
0
投票

解决方案是使用

@Value.Style
注释,使不可变对象看起来像:

@Value.Immutable
@Value.Style(allParameters = true, optionalAcceptNullable = true)
public interface Author {
    @Value.Parameter
    int id();

    @Value.Parameter
    String firstName();

    @Value.Parameter
    Optional<String> lastName();
    
    @Value.Parameter
    Book[] books();
}

@Value.Immutable
@Value.Style(allParameters = true, optionalAcceptNullable = true)
public interface Book {
    @Value.Parameter
    int id();

    @Value.Parameter
    int title();
}
  • OptionalAcceptNullable 允许为可选字段设置 null
  • allParameters 的作用类似于用
    @Value.Parameter
  • 标记所有属性/方法

注意 - SQL 中字段的顺序需要与不可变接口中方法的顺序匹配

© www.soinside.com 2019 - 2024. All rights reserved.