【问题标题】:Custom converter for Jooq ResultJooq 结果的自定义转换器
【发布时间】:2013-09-01 20:20:21
【问题描述】:

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

例如:

Employeepojo匹配数据库表是员工。

List<Employee> employeeList = sql.select(Tables.Employee)
                                 .from(Tables.EMPLOYEE).fetchInto(Employee.class);

同样,我们如何转换使用连接获取的记录?

例如:

Customerpojo匹配数据库表为customer

Employeepojo匹配数据库表为employee

sql.select(<<IWantAllFields>>).from(Tables.CUSTOMER)
                              .join(Tables.EMPLOYEE)
                              .on(Tables.EMPLOYEE.ID.equal(Tables.CUSTOMER.EMPLOYEE_ID))
                              .fetchInto(?);

【问题讨论】:

    标签: java sql type-conversion jooq modelmapper


    【解决方案1】:

    要从连接表源中选择所有字段,只需选择“无”:

    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&lt;Customer&gt; pojos 的映射。

    附带说明:与调用DefaultRecordMapper 的任何映射操作一样,当您的JOIN 操作产生两次相同的列名(例如CUSTOMER.IDEMPLOYEE.ID)时,映射可能无法按预期工作) - 因为DefaultRecordMapper 不知道特定列来自哪个表。

    对于更复杂的映射,您可能应该实现自己的RecordMapperProvider

    【讨论】:

    • 其实我想要两个表中的字段。
    • 我认为 ModelMapper 支持此功能,但我试图将每条记录转换为失败的自定义对象。有什么帮助吗? modelmapper.org/user-manual/jooq-integration
    • 恐怕 jOOQ 目前不支持结果到 POJO 的一对多映射。以上提示是迄今为止你能做的最好的……
    • 谢谢,现在我正在尝试使用 RecordMapperProvider 实现自定义映射。
    • 太棒了。让我知道事情的后续。如果出现任何与 RecordMapperProvider 相关的问题,只需提出新的 SO 问题,或在 jOOQ User Group 寻求帮助
    猜你喜欢
    • 2018-11-17
    • 2015-09-04
    • 2014-11-17
    • 2013-05-15
    • 1970-01-01
    • 2020-07-04
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多