【发布时间】:2017-09-25 15:45:32
【问题描述】:
我正在使用:
- 春季启动
- Spring 数据 JPA
- Spring 数据休息
- 休眠
- 嵌入式 H2 数据库
我正在尝试定义 2 个类,First 和 Second,这样就存在从 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 查询。
【问题讨论】:
-
首先非常感谢您发布这个问题。我已经搜索了几个小时来弄清楚如何使用 Spring Data REST JPA oneToOne 单向来创建满足我需求的确切用例。
-
顺便说一句,对于任何对多个@OneToOne 用例感兴趣的人,您可以在上面的示例中添加第三个,注意,如果您还定义了一个 CRUD 存储库无论是第二个还是第三个,它都不会按预期工作。出于某种原因,您不得为任何一个方向声明存储库(第二个或随后的第三个或第四个广告。infitintum。)。我不知道为什么,但是如果你排除说第三个的 JSON,它就会失败:
{ "firstName": "string", "second": { "secondName": "string" } }所以请确保你是否想要省略定向 one2ones。
标签: hibernate jpa spring-boot spring-data-jpa spring-data-rest