这些天我正在阅读有关 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
(许多学生参加一门类(class))。我使用了 EcpliseLink
实现 JPA
。
查询=从类(class)中选择学生和dummyFiled,执行场景:
- manyToOne(defaultFetch -> eager),隐式 JOIN。 结果:完成所有工作的单个 SQL 查询。
- manyToOne(获取 -> 惰性),隐式 JOIN。 结果:与1相同的SQL查询。
- manyToOne(defaultFetch -> eager),显式 JOIN。 结果:与1相同的SQL查询。
- manyToOne(获取 -> 惰性),显式 JOIN。 结果:与1相同的SQL查询。
所以在我的测试环境中(EclipseLink,..)我有从我的 JPQL 查询生成的相同 SQL 查询。所以我可以说性能是一样的(当然,我在我的测试条件中再说一遍,我希望有人能确认/纠正我的结果并制定一个通用规则。
最佳答案
它们的解析方式不同,因此根据查询、实体关系和其他类似内容,它们最终可能会成为不同的 SQL 查询。理想情况下,只要 JPQL 查询做同样的事情就应该没有区别,但是 it doesn't always work that way .
推荐的方法是使用显式连接,它还有其他优点,例如在惰性关系上指定 JOIN FETCH
。这个问题过于关注性能,显然如果其中一个性能更高但给出相同的结果,则没有理由使用较慢的那个。
启用 SQL 日志记录以查看生成的查询是验证您的应用程序是否正在执行您期望的查询的好方法,无论您使用哪种语法。您不能只依赖 JPQL,您需要了解和理解您的数据库,这样您就不会像 a_horse_with_no_name 喜欢调用 ORM 框架那样使用“混淆层”;)
关于java - JPA中的显式和隐式JOIN有什么区别? (表现),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49508486/