postgresql jOOQ通过引用端获取OneToOne

798qvoo8  于 2022-11-23  发布在  PostgreSQL
关注(0)|答案(1)|浏览(125)

我想获取一个User对象,如下所示:

record User(
    UUID id,
    String username,
    String ipAddress,
    long lastJoinAt,
    long createdAt,
    long updatedAt,
    GuildMembersRecord guildMember
) {}

record GuildMembersRecord(
    UUID id,
    UUID guildId,
    UUID userId,
    String role,
    OffsetDateTime updatedAt
    OffsetDateTime createdAt,
) {}

我的问题是公会成员总是空的,但是我可以在单独搜索的时候找到它。公会成员是拥有方,我的用户是引用方。我试图通过引用方来获得公会成员。
我的疑问是这样的:

UUID key = UUID.randomUUID();
this.context.select(
    USERS.ID,
    USERS.USERNAME,
    USERS.IP_ADDRESS,
    USERS.LAST_JOIN_AT,
    USERS.CREATED_AT,
    USERS.UPDATED_AT,
        row(
        DSL.select(GUILD_MEMBERS)
        .from(GUILD_MEMBERS)
        .where(GUILD_MEMBERS.USER_ID.eq(key))
    ).convertFrom(r -> r.into(GUILD_MEMBERS).into(GuildMembersRecord.class))
)
.from(USERS)
.where(USERS.ID.eq(key))
.fetchOne(Records.mapping(User::new))
bf1o4zei

bf1o4zei1#

这听起来类似于最近的support request #14174,其中用户正在寻找一种使用row(Select)来Map单个记录的方法。这似乎是一个合理的期望,类似于multiset(Select) value constructor,但正如这在标准SQL中不可用一样,它在jOOQ中以这种特定形式不可用。
最简单的方法是使用field(Select<R>):Field<R>Select转换为scalar correlated subquery

field(
    select(GUILD_MEMBERS)
    .from(GUILD_MEMBERS)
    .where(GUILD_MEMBERS.USER_ID.eq(key))
)

请注意,在本例中,不需要ad-hoc conversion或记录Map,因为您已经是projecting the entire table referenceGUILD_MEMBERS,这将生成预期的GuildMembersRecord

相关问题