可用版本: Dev (3.21) | 最新 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15

@OneToMany 或 @ManyToMany

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

在 JPA 中,你可能有一个像这样的 @OneToMany 映射

@Entity
public class Author {

    @OneToMany(mappedBy = "author")
    private Set<Book> items;

    // [...]
}

在 JPA 中,你可以指定此类关联是饥饿加载还是延迟加载。在 jOOQ 中,这无关紧要,因为你总是会通过查询显式地表达你的意图。没有任何事情是自动完成的

从映射的角度来看,将一组(或列表,任何内容)子对象嵌套在父对象中可能很方便(无论这是 @OneToMany 还是 @ManyToMany 关系)。 在 jOOQ 中,这样的映射总是临时的,基于每个查询,因此不需要反映你的实际数据库模型。 例如,你可以轻松地将一组 Language 值“嵌套”在 BookStore 中,我们稍后会看到。 使用 jOOQ,嵌套直接在 SQL 中使用 ORDBMS 特性(原生或模拟)完成。

因此,你可能拥有像这样的 DTO,而不是拥有实体类(注意,我们可能不需要投影 ID

public record Book(String title) {}
public record Author(String firstName, String lastName, List<Book> books) {}

DTO 可以是可重用的或临时的,每个查询都不同,这完全取决于你。 你可以将查询数据映射到上述记录中,如下所示

create.select(
           AUTHOR.FIRST_NAME,
           AUTHOR.LAST_NAME,

           // Nested collection using to-many path correlation here:
           multiset(
               select(AUTHOR.book().TITLE)
               .from(AUTHOR.book())

           // Ad-hoc converter here:
           ).convertFrom(r -> r.map(Records.mapping(Book::new))))
      .from(AUTHOR)

      // Ad-hoc converter here
      .fetch(Records.mapping(Author::new));

上面的映射是完全编译时类型安全的。

本节中使用的一些 jOOQ 功能是

反馈

您对此页面有任何反馈吗? 我们很乐意听取您的意见!

The jOOQ Logo