代码之家  ›  专栏  ›  技术社区  ›  ps0604

在Jooq中填充子类

  •  2
  • ps0604  · 技术社区  · 7 年前

    我有以下Java类:

    public class Font {
    
       private String fontFamily;
    
       private int fontSize;
    
       // other members and getters/setters
    } 
    

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   wallek876    7 年前

    你可以使用 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 还你海关吗

        2
  •  1
  •   Lukas Eder    7 年前

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

    @Embeddable 类型,然后将为所有查询自动执行上述操作: https://github.com/jOOQ/jOOQ/issues/2530