实际上我们使用fetchInto()将结果转换为对象列表.
例如:
员工pojo匹配数据库表是员工.
List<Employee> employeeList = sql.select(Tables.Employee) .from(Tables.EMPLOYEE).fetchInto(Employee.class);
同样,我们如何转换我们使用连接获取的记录?
例如:
客户pojo匹配数据库表是客户.
员工pojo匹配数据库表是员工.
sql.select(<<IWantAllFields>>).from(Tables.CUSTOMER) .join(Tables.EMPLOYEE) .on(Tables.EMPLOYEE.ID.equal(Tables.CUSTOMER.EMPLOYEE_ID)) .fetchInto(?);
解决方法
要从连接的表源中选择所有字段,只需选择“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);
这将生成List< Customer>的地图.每个EMPLOYEE_ID值的pojos.
另请注意:与调用DefaultRecordMapper
的任何映射操作一样,当JOIN操作生成两次相同的列名称(例如CUSTOMER.ID和EMPLOYEE.ID)时,映射可能无法按预期工作 – 因为DefaultRecordMapper不会知道特定列来自哪个表.
对于更复杂的映射,您应该实现自己的RecordMapperProvider