Java 在Jooq中填充子类
我有以下Java类:Java 在Jooq中填充子类,java,jooq,Java,Jooq,我有以下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;
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,
.....
);
我像这样使用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中有没有办法在生成器中注释或配置数据库中的列与子类字段之间的关系?您可以使用自定义从记录映射类的方式,我不知道您的构造函数是什么样子,但内联示例可以是:
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;
}
});
RichText RichText=create.select()
.from(富文本)
.where(富文本代码eq(代码))
.fetchOne(新记录映射器(){
@凌驾
公共RichText地图(记录){
RichText RichText=新的RichText(
record.get(富文本代码),
record.get(RICH_TEXT.RICH_STRING),
新字体(
record.get(RICH_TEXT.FONTTITLEFAMILY),
record.get(RICH_TEXT.FONTTITLESIZE)
),
新字体(
record.get(RICH_TEXT.FontSection系列),
record.get(富文本大小)
)
);
返回richText;
}
});
我在飞行中输入了这个,所以可能是我弄错了一些字段名
您还可以设置自定义,以在Jooq配置中返回自定义的
RecordMapper
。您可以使用的一个鲜为人知的功能,即映射到嵌套类型的功能。这将需要对嵌套值的所有列使用别名:
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的
@embeddeble
类型的内容,然后将对所有查询自动执行上述操作:这很有效。因为我在这个类中没有构造函数,所以我使用了record.into(richText)
,然后按照您的方式设置字体。另外,我没有使用匿名类,而是创建了一个可重用的新类。insert
s而不是read
s是否有类似的映射器?我找不到它是的,有一个接口RecordUnmapper
,还有一个RecordUnmapperProvider
,它的作用是相同的,但在另一个方向,从POJO到record,查看文档我也找不到它,但我知道它就在那里。你能看一下吗?@ps0604你不应该用这些内容来要求别人对你的其他问题进行评论,你需要耐心,我相信无论如何都会有人回答你的问题。