Jooq实体映射

时间:2017-05-02 13:55:27

标签: java sql jooq

我有以下架构:

项目(ID,NAME) Projects_Users(PROJECT_ID,USERS_ID) 用户(NAME,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

时,查询会重新生成thousends结果

1 个答案:

答案 0 :(得分:3)

你正在做两件事:

运行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,例如: