在Jooq中填充子类

时间:2019-02-09 16:22:17

标签: java jooq

我有以下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,

   .....

);

我使用Jooq读取rich_text表,如下所示:

    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 :(得分:1)

您可以使用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,以在Jooq配置中返回自定义RecordMapper

答案 1 :(得分:0)

您可以使用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