【问题标题】:Populating subclasses in Jooq在 Jooq 中填充子类
【发布时间】:2019-02-21 17:46:05
【问题描述】:

我有以下 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 中有没有办法在生成器中注释或配置数据库中的列与子类的字段之间的关系?

【问题讨论】:

    标签: java jooq


    【解决方案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;
    
                    }
                });
    

    我是即时输入的,所以可能是我弄错了某些字段名称。

    您还可以在 Jooq 配置中设置自定义 RecordMapperProvider 以返回自定义 RecordMapper

    【讨论】:

    • 这行得通。由于我在此类中没有构造函数,因此我使用了record.into(richText),然后按照您的方式设置字体。此外,我没有使用匿名类,而是创建了一个可重用的新类。
    • inserts 是否有类似的映射器,而不是 reads?没找到
    • 是的,有一个接口RecordUnmapper 和一个RecordUnmapperProvider,它的作用相同,但在另一个方向,从 POJO 到记录,查看文档我也找不到它,但我知道它就在那里。
    • 你能看看this吗?
    • @ps0604 你不应该用评论来询问你的其他问题,你需要耐心等待,我相信无论如何都会有人回答你的问题。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-16
      • 2017-03-14
      • 1970-01-01
      相关资源
      最近更新 更多