有一个很好的选择,可以自动、类型安全地将 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() 作为可空字段。
解决方案是使用
@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();
}
@Value.Parameter
注意 - SQL 中字段的顺序需要与不可变接口中方法的顺序匹配