Возвращает пользовательскую запись JOOQ при использовании общего табличного выражения или подзапроса

#java #sql #jooq

#java #sql #jooq

Вопрос:

Я работаю над сложным запросом, который содержит общее табличное выражение и несколько подзапросов. Я пытаюсь сохранить код читаемым, разделив его на методы, но у меня немного проблемы.

Есть ли способ вернуть пользовательскую запись JOOQ при создании общего табличного выражения или подзапроса вместо стандартных записей JOOQ?

Пример общего табличного выражения:

 public static final String COLUMN1 = "column_1";
public static final String COLUMN2 = "column_2";
public static final String COLUMN3 = "column_3";
public static final String COLUMN4 = "column_4";
public static final String COLUMN5 = "column_5";
public static final String COLUMN6 = "column_6";

public CommonTableExpression<Record6<Long, String, String, LocalDate, LocalDate, Boolean>> getMyFirstCTE() {
    var t = MY_TABLE.as("t");

    return name("t")
            .fields(COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5, COLUMN6)
            .as(
                    select(
                            t.COLUMN1,
                            t.COLUMN2,
                            t.COLUMN3,
                            t.COLUMN4,
                            t.COLUMN5,
                            t.COLUMN6)
                    .from(t)
                    .where(t.COLUMN6.isFalse()));
}
  

и пример подзапроса:

 public Table<Record6<Long, String, String, LocalDate, LocalDate, Boolean>> getMyFirstTable() {
    var t = MY_TABLE.as("t");

    return select(
                    t.COLUMN1,
                    t.COLUMN2,
                    t.COLUMN3,
                    t.COLUMN4,
                    t.COLUMN5,
                    t.COLUMN6)
            .from(t)
            .where(t.COLUMN6.isFalse()).asTable("t");
}
  

Если вызывающий объект хочет использовать поля из общего табличного выражения, оно выражается так, как показано ниже (то же самое относится и к подзапросу):

     var cte = getMyFirstCTE();
var column1 = cte.field(COLUMN1, Long.class);
var column2 = cte.field(COLUMN2, String.class);
var column3 = cte.field(COLUMN3, String.class);
var column4 = cte.field(COLUMN4, LocalDate.class);
var column5 = cte.field(COLUMN5, LocalDate.class);
var column6 = cte.field(COLUMN6, Boolean.class);
  

Было бы неплохо иметь эти подписи вместо:

 public static CommonTableExpression<MyFirstRecord> getMyFirstCTE() {}

public static Table<MyFirstRecord> getMyFirstTable() {}
  

Не только для удобства чтения, но и для того, чтобы (надеюсь) не нужно было явно добавлять тип класса и иметь возможность делать что-то вроде MyFirstRecord.COLUMN1 .

Есть ли способ сделать это?