gpt4 book ai didi

使用内连接 hibernate 单向@OneToOne

转载 作者:行者123 更新时间:2023-12-03 22:28:02 28 4
gpt4 key购买 nike

我在用:

  • Spring Boot
  • Spring Data JPA
  • Spring Data Rest
  • hibernate
  • 嵌入式H2数据库

  • 我正在尝试定义 2 个类, FirstSecond ,这样就有来自 First 的一对一映射至 Second .由于我正在尝试通过 Spring Data Rest 托管查询,这会将数据转换为 JSON,因此我认为执行 EAGER 获取最有意义。

    所以,我有以下几点:
    @Entity
    public class First {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "FIRST_ID")
    private long id;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "SECOND_ID")
    private Second second;

    // more/getters/settings
    }

    @Entity
    public class Second {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "SECOND_ID")
    private long id;

    // more/getters/settings
    }

    当我搜索 First 类型的数据时, 我得到了 First 的 SELECT 查询键入然后为每个 Second 单独的 SELECT 查询其中 SECOND_ID 匹配 First 中引用的外键.

    对这些数据执行 INNER JOIN 以在单个查询中完成所有操作是最有意义的。如:
    SELECT * FROM FIRST
    INNER JOIN SECOND ON FIRST.SECOND_ID

    我可以直接在数据库上运行这个查询并得到一个连接两个表的表。

    我怎样才能让 JPA/Hibernate 做到这一点?这似乎是一个常见的操作,我觉得我遗漏了一些明显的东西。

    编辑:请注意,我正在使用通过 Spring Data Rest 自动生成的 REST 端点运行查询。我已经定义了一个 Spring Data 存储库:
    @RepositoryRestResource(path = "first")
    public interface FirstRepository extends CrudRepository<First, Long> {
    }

    然后,通过访问 http://host/first ,我让 Spring 运行 findAll 操作,该操作有效,但再次触发大量 SELECT 查询。

    最佳答案

    试试这个变体:

    @RepositoryRestResource(path = "first")
    public interface FirstRepository extends CrudRepository<First, Long> {

    @Override
    @EntityGraph(attributePaths = {"second"})
    Iterable<First> findAll();
    }

    关于使用内连接 hibernate 单向@OneToOne,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43664691/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com