【发布时间】:2018-09-05 14:28:06
【问题描述】:
这些天我正在阅读有关JPA 的信息。我了解到可以在 JPQL 中使用 explicit 或 implicit JOIN。
显式连接
em.createQuery(“SELECT b.title, p.name FROM Book b JOIN b.publisher p”).getResultList();
隐式连接
em.createQuery(“SELECT b.title, b.publisher.name FROM Book b”).getResultList();
这些例子的来源:link
我的问题是:explicit 和implict JOIN 在性能方面有什么区别吗?
更新
我已经阅读了@MatteoBaldi 和@Kayaman 所写的内容,我已经做了一些测试,我想与你分享结果。
我创建了两个实体:students 和 course,我有一个 manyToOne(许多学生参加一门课程)。我用EcpliseLink实现JPA。
Query = 从课程中选择学生和 dummyFiled,执行场景:
- manyToOne (defaultFetch -> eager),隐式 JOIN。 结果:完成所有工作的单个 SQL 查询。
- manyToOne (Fetch -> lazy),隐式 JOIN。 结果:与 1 相同的 SQL 查询。
- manyToOne (defaultFetch -> eager),显式 JOIN。 结果:与 1 相同的 SQL 查询。
- manyToOne(获取 -> 惰性),显式 JOIN。 结果:与 1 相同的 SQL 查询。
因此,在我的测试环境(EclipseLink,..)中,我有从我的 JPQL 查询生成的相同 SQL 查询。所以我可以说性能是一样的(当然,在我的测试条件中我再说一遍,我希望有人可以确认/纠正我的结果并制定一般规则。
【问题讨论】:
-
这里您选择的是单个对象属性,这并不是真正的 JPQL 用例,当您选择整个对象模型时会变得很有趣——尤其是当它们嵌套多个层次时。然后可空状态、延迟获取和连接可以开始对查询和填充事物的方式以及最终将向数据库发起多少查询以完成工作产生影响。