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

@OneToOne 或 @ManyToOne

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

在 JPA 中,您可能拥有像这样的 @ManyToOne 映射

@Entity
public class Book {

    @Id
    @GeneratedValue
    private Long id;

    @Column
    private String title;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "language_id")
    private Language language;

    // [...]
}

在 JPA 中,您可以指定是否应急切或延迟获取此类关联。 在 jOOQ 中,这无关紧要,因为您始终会通过查询显式表达您的意图。 没有任何事情是自动完成的

从映射的角度来看,将父对象嵌套在子对象中(无论这是 @OneToOne 还是 @ManyToOne 关系)可能很方便。 在 jOOQ 中,这样的映射始终是临时的,基于每个查询,因此它不需要反映您的实际数据库模型。 例如,您可以轻松地将 Title “嵌套”在 Book 中。 使用 jOOQ,嵌套直接在 SQL 中使用 ORDBMS 功能(原生或模拟)完成。

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

public record Language(String code, String description) {}
public record Book(String title, Language language) {}

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

create.select(
           BOOK.TITLE,

           // Nested record here:
           row(

               // Implicit join here
               BOOK.language().CD,
               BOOK.language().DESCRIPTION

           // Ad-hoc converter here:
           ).mapping(Language::new))
      .from(BOOK)

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

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

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

反馈

您对此页面有任何反馈吗? 我们很乐意听到它!

The jOOQ Logo