【问题标题】:Jooq entity mappingJooq 实体映射
【发布时间】:2017-09-30 02:06:29
【问题描述】:

我有以下架构:

项目(ID、名称) Projects_Users(PROJECT_ID、USERS_ID) 用户(姓名、ID)

实体如下

public class Projects {

    private String name;
    private long id;
    private List<User> users;

    public Projects() {
    }
}


public class User {

    private String name;
    private Long id;
}

如此明显的一对多。项目可以有多个用户。

现在我的目标是编写 jooq 查询,在那里我可以使用相应的用户获取项目对象。

.select(PROJECT.NAME, PROJECT.ID, USERS)
.from(PROJECT)
.join(USERS_PROJECT).on(USERS_PROJECT.PROJECT_ID=PROJECT.ID)
.join(USERS).on(USERS.ID=USERS_PROJECT.USER_ID)
.fetchInto(Project.class);

但查询会在预期 ~15 时返回 thounds 结果

【问题讨论】:

    标签: java sql jooq


    【解决方案1】:

    你在做两件事:

    运行 jOOQ 查询:

    .select(PROJECT.NAME, PROJECT.ID, USERS)
    .from(PROJECT)
    .join(USERS_PROJECT).on(USERS_PROJECT.PROJECT_ID.eq(PROJECT.ID))
    .join(USERS).on(USERS.ID.eq(USERS_PROJECT.USER_ID))
    .fetch();
    

    这很简单。 jOOQ 将上述表达式转换为 SQL 字符串,将其发送到 JDBC,接收结果集并为您提供 jOOQ Result。显然,结果是非规范化的(因为您编写了连接),因此您有很多行(大约与 USERS_PROJECT 表中的行一样多)。

    Result 映射到您的 POJO

    现在,这让您感到困惑。您调用了fetchInto(Project.class),这只是调用fetch().into(Class) 的语法糖。这是两个独立的步骤,特别是into(Class) 步骤不知道您的查询或您的意图。因此,它不“知道”您期待 15 个独特的项目和嵌套的用户集合。

    但是有一些方法可以更明确地映射事物。例如。通过使用intoGroups(Class, Class)。这可能不会像您设计的那样返回嵌套类型,而是像一个

    Map<Person, List<User>> map = query.fetch().intoGroups(Person.class, User.class);
    

    您可以从那里手动获取它。或者,您可以写一个RecordMapper 并使用它:

    List<Person> list = query.fetch().map(record -> new Person(...));
    

    或者,您可以使用任何recommended third party mappers,例如:

    【讨论】:

    • 如果 user.class 和 person.class 不是实体类(表)怎么办。我想要一个定制的响应。有什么方法可以实现吗?
    • @GauravRatnawat:获得自定义回复的最佳方式是提出自定义问题!
    猜你喜欢
    • 2022-01-22
    • 2012-05-25
    • 2011-07-13
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多