Как перевести динамический запрос из QueryDSL в JOOQ? - PullRequest
1 голос
/ 08 октября 2019

Я использую QueryDSL просто для динамических запросов в Spring Boot 2+ с приложениями Spring Data JPA следующим образом:

@Override
public Iterable<Books> search(String bookTitle, String bookAuthor, String bookGenre) {
  BooleanBuilder where = dynamicWhere(bookTitle, bookAuthor, bookGenre);
  return booksRepository.findAll(where, orderByTitle());
}

public BooleanBuilder dynamicWhere(String bookTitle, String bookAuthor, String bookGenre) {
  QBooks qBooks = QBooks.books;
  BooleanBuilder where = new BooleanBuilder();
  if (bookTitle != null) {
    where.and(qBooks.title.equalsIgnoreCase(bookTitle));
  }
  if (bookAuthor!= null) {
    where.and(qBooks.author.eq(bookAuthor));
  }
  if (bookGenre!= null) {
    where.and(qBooks.genre.eq(bookGenre));
  }
  return where;
}

Я хочу использовать JOOQ аналогичным прозрачным способом, но я не знаю, как это сделать элегантно. Мне также нравится, что в JOOQ нет сгенерированных конструкций, подобных QBooks, хотя я думаю, что JOOQ также генерирует некоторые таблицы. Во всяком случае, я запутался и не смог найти ответ в Интернете, поэтому я спрашиваю, можно ли это сделать и как.

Спасибо

1 Ответ

0 голосов
/ 08 октября 2019

У jOOQ нет определенного «строителя» для построения ваших предикатов. Весь «строительный» API расположен непосредственно в типе предиката, то есть Condition

@Override
public Iterable<Books> search(String bookTitle, String bookAuthor, String bookGenre) {
  Condition where = dynamicWhere(bookTitle, bookAuthor, bookGenre);
  return dslContext.selectFrom(BOOKS)
                   .where(where)
                   .orderBy(BOOKS.TITLE)
                   .fetchInto(Books.class);
}

public Condition dynamicWhere(String bookTitle, String bookAuthor, String bookGenre) {
  Condition where = DSL.noCondition();
  if (bookTitle != null) {
    where = where.and(BOOKS.TITLE.equalsIgnoreCase(bookTitle));
  }
  if (bookAuthor!= null) {
    where = where.and(BOOKS.AUTHOR.eq(bookAuthor));
  }
  if (bookGenre!= null) {
    where = where.and(BOOKS.GENRE.eq(bookGenre));
  }
  return where;
}

Это предполагает:

1) что вы ввелиправильно настроенный DSLContext 2) Вы используете генератор кода jOOQ

Для получения дополнительной информации см. также https://www.jooq.org/doc/latest/manual/sql-building/dynamic-sql/

...