当前位置: 首页 > 知识库问答 >
问题:

Jooq实体映射

林君博
2023-03-14

我有以下模式:

项目(ID,名称)项目用户(项目ID,用户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时,查询将恢复千分之一的结果

共有1个答案

程承恩
2023-03-14

你在做两件事:

.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,接收结果集,并向您提供jOOQresult。显然,结果是非规范化的(因为您编写了联接),因此您有许多行(大约相当于USERS\u项目表中的行数)。

这就是让你困惑的地方。您调用了felchTo(Project.class),这只是调用getch()的语法糖。进入(Class)。这是两个独立的步骤,特别是,进入(Class)步骤不知道您的查询,也不知道您的意图。因此,它不“知道”你在期待大约15个独特的项目和一个嵌套的用户集合。

但有一些方法可以更明确地描绘事物。例如,使用分组(Class,Class)。这可能不会返回您设计的嵌套类型,而是类似于

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

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

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

或者,您可以使用任何推荐的第三方映射器,例如:

  • http://modelmapper.org
  • http://simpleflatmapper.org
 类似资料:
  • 快速总结我想要实现的目标。请给出实施或设计建议:) 我有两个表:用户,图像。在UserDO中,我希望保留一组所有用户的图像,以及单个图像,即用户的肖像(在我的示例中,该组将包括肖像): 在ImageDO中,我有一个userid作为外键来记录哪个用户上传了图像。但是它没有布尔值,因为认为一个用户可能会上传许多图像,但只有一个是肖像。 有什么方法可以实现这一点吗?或者我需要维护另一个表(例如,Port

  • 我在Kotlin-vertx项目中配置了Hibernate,我设法设置了所有内容,但当我运行HQL查询时,它会输出: 提前谢了。

  • 问题内容: 我是Go语言的新手,具有C#背景并且对如何构造Go应用程序感到困惑。 假设我正在构建一个REST API,它将位于数据库之上。还要说,即使完成后,鉴于业务的变迁等,此应用程序可能仍需要频繁更改。 在带有诸如Entity Framework和DTO之类的工具的C#中,我通过从控制器给出的结果中抽象出数据库来缓解此问题。如果更改数据库中一堆字段的名称,则可能必须更改数据库访问逻辑,但是希望

  • 我在JPA实体映射方面有问题。我有一些课: A级 类别b Classc *如何解决这个问题?*我还能使用类继承吗?还是另一个解决这个的方法? 谢了。

  • 我对这些技术是新的,所以提前道歉。 我在我的应用程序中使用了springboot、Spring JPA、hibernate和mapstruct。

  • 我正在尝试使用AutoMapper在LLBLGen实体和DTO之间创建映射。 我的DTO如下所示: ParentEntity包含一个与DTO列表同名的ChildCollection和一个Id(需要忽略其他LLBL字段)。因此,当ParentEntity映射到父d to时,它也应该将ChildCollection映射到一个子列表。 这就是我到目前为止得到的: 这会导致Id被映射,但List的计数为0