自定义 Jooq Result 转换器

5

实际上我们使用fetchInto()将结果转换为对象列表。

例如:

Employee的POJO匹配数据库表employee。

List<Employee> employeeList = sql.select(Tables.Employee)
                                 .from(Tables.EMPLOYEE).fetchInto(Employee.class);
同样地,我们如何将使用联接获取的记录进行转换呢? 例如: Customer Java对象对应的数据库表是 customerEmployee Java对象对应的数据库表是 employee
sql.select(<<IWantAllFields>>).from(Tables.CUSTOMER)
                              .join(Tables.EMPLOYEE)
                              .on(Tables.EMPLOYEE.ID.equal(Tables.CUSTOMER.EMPLOYEE_ID))
                              .fetchInto(?);
1个回答

3

要从已连接的表中选择所有字段,请选择“none”:

Result<Record> result =
sql.select().from(Tables.CUSTOMER)
            .join(Tables.EMPLOYEE)
            .on(...)
            .fetch();
jOOQ将会自动检测已知的表格源,并为您生成所有列引用。创建POJO关系的一种方法是使用各种Result.intoGroups()方法之一。例如:
Map<Integer, List<Customer>> map =
result.intoGroups(CUSTOMER.EMPLOYEE_ID, Customer.class);
这将生成一个基于EMPLOYEE_ID值的List<Customer> pojos映射。需要注意的是:对于任何调用DefaultRecordMapper的映射操作,如果你的JOIN操作产生两次相同的列名(例如CUSTOMER.IDEMPLOYEE.ID),则可能无法按预期工作,因为DefaultRecordMapper不知道特定列来自哪个表格。对于更复杂的映射,您应该实现自己的RecordMapperProvider

实际上,我想要两个表格中的字段。 - Syed Shahul
我认为ModelMapper支持这个功能,但是我尝试将每个记录转换为自定义对象时失败了。有什么帮助吗?http://modelmapper.org/user-manual/jooq-integration/ - Syed Shahul
很抱歉,jOOQ目前不支持将结果一对多映射到POJO的功能。以上提示是目前为止最好的解决方案... - Lukas Eder
1
谢谢,现在我正在尝试使用RecordMapperProvider实现自定义映射。 - Syed Shahul
好的,请告诉我进展如何。如果出现与 RecordMapperProvider 相关的任何问题,请在 Stack Overflow 上提出新问题,或在 jOOQ 用户组 上寻求帮助。 - Lukas Eder
我正在学习JOOQ,但我认为如果连接结果集具有相同名称的多个列,则result.intoGroups(Field, Class)将无法处理POJOs。因此,在这种情况下,您的客户名称可能会获得员工名称的值,反之亦然,而不会抛出任何异常。似乎result.intoGroups(Table)更安全,但如果我错了,请纠正我,因为我只使用JOOQ大约30分钟 :) - nogridbag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,