Заполнение подклассов в Jooq - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть следующий класс Java:

public class Font {

   private String fontFamily;

   private int fontSize;

   // other members and getters/setters
} 

В этом классе используется класс Font:

public class RichText {

   private int code;

   private String richString;

   private Font titleFont;

   private Font subtitleFont;

   // other members and getters/setters
} 

Теперь у меня есть одна таблица в базе данных для хранения RichText, обратите внимание, что я сплющил классы шрифтов, чтобы избежать создания дополнительной таблицы:

CREATE TABLE rich_text (

   code int,

   rich_string text,

   fontTitleFamily varchar(20),

   fontTitleSize int,

   fontSubtitleFamily varchar(20),

   fontSubtitleSize int,

   .....

);

Я читаю таблицу rich_text, используя Jooq, примерно так:

    Record rec = create.select()
            .from(RICH_TEXT)
            .where(RICH_TEXT.CODE.eq(code))
            .fetchAny();

    if (rec == null)
        throw new RecordNotFoundException();

    RichText richText = new RichText();
    rec.into(richText);

Но это нене заполнять классы шрифтов, потому что имена разные.Я не хочу нормализовать эту таблицу, так как она будет иметь только два шрифта.

Есть ли способ в Jooq аннотировать или настроить в генераторе отношения между столбцами в базе данных и полямиподкласс?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Вы можете использовать менее известную функцию DefaultRecordMapper, способную отображать вложенные типы.Это потребует наложения всех ваших столбцов на вложенные значения:

RichText result = create
    .select(
         RICH_TEXT.CODE,
         RICH_TEXT.RICH_STRING,
         RICH_TEXT.FONTTITLEFAMILY.as("titleFont.fontFamily"),
         RICH_TEXT.FONTTITLESIZE.as("titleFont.fontSize"),
         RICH_TEXT.FONTSUBTITLEFAMILY.as("subtitleFont.fontFamily"),
         RICH_TEXT.FONTSUBTITLESIZE.as("subtitleFont.fontSize"),
         ...)
    .from(RICH_TEXT)
    .where(RICH_TEXT.CODE.eq(code))
    .fetchAnyInto(RichText.class);

В будущей версии jOOQ будет указано что-то похожее на типы JPA @Embeddable, что затем автоматизирует вышеуказанное для всех запросов:https://github.com/jOOQ/jOOQ/issues/2530

0 голосов
/ 09 февраля 2019

Вы можете использовать RecordMapper для настройки того, как вы хотите, чтобы ваши классы отображались из записи, я не знаю, как выглядят ваши конструкторы, но встроенный пример может быть:

RichText richText = create.select()
            .from(RICH_TEXT)
            .where(RICH_TEXT.CODE.eq(code))
            .fetchOne(new RecordMapper<Record, RichText>() {

                @Override
                public RichText map(Record record) {

                    RichText richText = new RichText(
                            record.get(RICH_TEXT.CODE),
                            record.get(RICH_TEXT.RICH_STRING ),
                            new Font(
                                record.get(RICH_TEXT.FONTTITLEFAMILY), 
                                record.get(RICH_TEXT.FONTTITLESIZE)
                            ),
                            new Font(
                                record.get(RICH_TEXT.FONTSUBTITLEFAMILY), 
                                record.get(RICH_TEXT.FONTSUBTITLESIZE)
                            )

                        );

                    return richText;

                }
            });

Я набрал это на лету, так что вполне возможно, что я неправильно назвал какое-то поле.

Вы также можете установить пользовательский RecordMapperProvider, чтобы вернуть свой пользовательскийRecordMapper в конфигурации Jooq.

...