Как стать автором
Обновить

Почему JOOQ — идеальный инструмент для работы с БД при интеграционном тестировании API

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров2.9K
Всего голосов 5: ↑4 и ↓1+3
Комментарии5

Комментарии 5

Чем не устроил банальный хибер и спринг jpa?

Тем, что нужно прописывать много сущностей и их взаимосвязи, а потом их поддерживать, так как они могут меняться. Маленькая вариативность для запросов. Например, у нас есть поиск по 5 параметрам, где все они не обязательно могут присутствовать. Соответственно, нужно делать разные запросы, которые будут содержать в себе разный набор параметров, либо сильно всё усложнять.

Например, у нас есть поиск по 5 параметрам, где все они не обязательно могут присутствовать. Соответственно, нужно делать разные запросы, которые будут содержать в себе разный набор параметров, либо сильно всё усложнять.

Так ведь есть JpaSpecification, как раз для таких целей. С помощью criteriaBuilder создать нужный набор условий.

Но в целом для меня все равно Jooq > Hibernate ( хотя когда нужно каскадно сохранять множество сущностей, то тут хиберу нет равных, но и поддерживать это добро тоже конечно не легко)

Чтобы не генерить цепочки вида

           .fetch()
           .map(this::getCompanyDtoByRecord)
           .get(0);

Можно использовать методы fetchSingle (возвращает одну запись или кидает exception) или fetchOne (возвращает null или одну запись или кидает exception).

Чтобы конвертировать Record в ваш DTO удобно использовать переиспользуемый объект RecordMapper. Его принимают все fetch методы, состоять этот объект будет из одного метода, идентичного вашему getCompanyDtoByRecord.

У вас select возвращает все колонки таблицы Company. В такой ситуации jooq вернёт вам не просто абстрактный Record, а CompanyRecord (который сам вам и сгенерит). У данного класса в добавок к методам getValue будут и таблично-спецефичные геттеры getId и getName.

В итоге ваш код станет вот таким:

public CompanyDto getCompanyById(Integer id) {
   return context.selectFrom(Company.COMPANY)
           .where(Company.COMPANY.ID.eq(id))
           .fetchSingle(new CompanyRecordMapper());
}
...

public class CompanyRecordMapper extends RecordMapper<CompanyRecord, CompanyDto> { 
  public CompanyDto map(CompanyRecord record) {
    return new CompanyDto(record.getId(), record.getName());
  }
}

Для развития можно ещё про Jdbi почитать

Зарегистрируйтесь на Хабре, чтобы оставить комментарий