Jooq转换嵌套对象



我遇到的问题是如何将jooq选择查询转换为某些对象。如果我使用默认的jooq映射器,它可以工作,但是必须提到所有字段,并且按照精确的顺序。如果我使用简单的平面映射器,我在使用multiset时会遇到问题。

简单平面映射的问题:

class Student {
private final id;
Set<String> bookIds;
}
private static final SelectQueryMapper<Student> studentMapper = SelectQueryMapperFactory.newInstance().newMapper(Studen.class);
var students = studentMapper.asList(
context.select(
STUDENT.ID.as("id),
multiset(
select(BOOK.ID).from(BOOK).where(BOOK.STUDENT_ID.eq(STUDENT.ID)),
).convertFrom(r -> r.intoSet(BOOK.ID)).as("bookIds"))
.from(STUDENT).where(STUDENT.ID.eq("<id>"))
)

属性bookIds返回的简单平面映射器:精确的字符串集合["[[book_id_1], [book_id_2]]"],而不是["book_id_1", "book_id_2"]

正如我已经提到的,这是与默认的jooq映射器一起工作,但在我的情况下,所有属性都没有在列中提到,并且有可能添加一些没有在表中出现的属性。

问题是,是否有可能告诉简单平面映射器映射是一对一的(Set to Set),或者有默认的jooq映射器,它将忽略不匹配和无序字段。

在这种情况下最好的方法是什么

一旦你开始使用jOOQ的MULTISET和ad-hoc转换功能,那么我怀疑你还需要第三方,如SimpleFlatMapper,我不认为可以反序列化jOOQ内部生成的JSON序列化格式(它目前是数组的数组,而不是对象的数组,但没有这种格式的规范,它可能在任何版本中改变)。

直接使用ad-hoc转换器。

如果我使用默认的jooq映射器,它可以工作,但必须提到所有字段,并按照确切的顺序

你应该把它看作一个特性,而不是一个bug。它增加了类型安全性,并迫使您考虑您的精确投影,帮助您避免投影过多的数据(这将严重降低您的查询速度!)

但是你不必使用目前在jOOQ手册和博客文章中提倡的程序化RecordMapper方法。"往往比;反射DefaultRecordMapper将继续工作,你只需要有匹配的列别名/目标类型getter/setter/成员名。

最新更新