Пользовательский конвертер для Jooq Result

На самом деле мы используем fetchInto() для преобразования результатов в список объектов.

Например:

Employee Таблица сопоставления базы данных pojo является сотрудником.

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

аналогично, как мы могли бы преобразовать записи, которые мы извлекаем, используя соединения?

Например:

Customer Таблица сопоставления базы данных pojo: customer.

Employee Таблица соответствия базы данных pojo: employee.

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

person Syed Shahul    schedule 29.08.2013    source источник


Ответы (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);

Это создаст карту List<Customer> pojos на EMPLOYEE_ID значение.

На заметку: как и в случае любой операции отображения, которая вызывает DefaultRecordMapper сопоставление может работать не так, как ожидалось, если ваша операция JOIN создает два раза одно и то же имя столбца (например, CUSTOMER.ID и EMPLOYEE.ID), поскольку DefaultRecordMapper не знает, из какой таблицы происходит конкретный столбец.

Для более сложного сопоставления вам, вероятно, следует реализовать собственный RecordMapperProvider

person Lukas Eder    schedule 30.08.2013
comment
На самом деле мне нужны поля из обеих таблиц. - person Syed Shahul; 30.08.2013
comment
И я думаю, что ModelMapper поддерживает эту функцию, но я пытаюсь преобразовать каждую запись в пользовательский объект, но это не удалось. Любая помощь? modelmapper.org/user-manual/jooq-integration - person Syed Shahul; 30.08.2013
comment
Я боюсь, что jOOQ в настоящее время не поддерживает сопоставление результатов «один ко многим» с POJO. Приведенные выше советы - лучшее, что вы можете сделать на данный момент... - person Lukas Eder; 30.08.2013
comment
Спасибо, теперь я пытаюсь реализовать пользовательское сопоставление с помощью RecordMapperProvider. - person Syed Shahul; 05.09.2013
comment
Отлично. Дайте мне знать, как это происходит. Если возникнут какие-либо вопросы, связанные с RecordMapperProvider, просто задайте новый вопрос SO или обратитесь за помощью на Группа пользователей jOOQ - person Lukas Eder; 06.09.2013
comment
Я только изучаю JOOQ, но я считаю, что result.intoGroups(Field, Class) не будет работать для POJO, если в наборе результатов соединения есть несколько столбцов с одинаковыми именами. Таким образом, в этом случае имя вашего клиента может получить значение имени сотрудника или наоборот без каких-либо исключений. Кажется, что result.intoGroups(Table) НАМНОГО безопаснее, но, пожалуйста, поправьте меня, если я ошибаюсь, поскольку я использую JOOQ всего 30 минут или около того :) - person nogridbag; 19.01.2015