java - JPA中的显式和隐式JOIN有什么区别? (表现)

标签 java jpa jpa-2.0 jpql

这些天我正在阅读有关 JPA 的内容。我了解到可以在 JPQL 中使用 explicitimplicit 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

我的问题是:explicitimplict JOIN 在性能方面有什么不同吗?


更新

我读过你写的@MatteoBaldi 和@Kayaman,我做了一些测试,我想与你分享结果。

我创建了两个实体:studentscourse,并且我有一个 manyToOne(许多学生参加一门类(class))。我使用了 EcpliseLink 实现 JPA

查询=从类(class)中选择学生和dummyFiled,执行场景:

  1. manyToOne(defaultFetch -> eager),隐式 JOIN。 结果:完成所有工作的单个 SQL 查询。
  2. manyToOne(获取 -> 惰性),隐式 JOIN。 结果:与1相同的SQL查询。
  3. manyToOne(defaultFetch -> eager),显式 JOIN。 结果:与1相同的SQL查询。
  4. 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/

相关文章:

java - JPA 实体监听器和@embeddable

java - 通过使用 Jackson API 动态发送 key 来检索 JSON 字符串中的值?

java - 反序列化映射 Jackson

java - 在 JAVA 中将数据从文本文件传输到 MySQL 表时出现 OutOfMemory 错误

java.rmi.ServerException : RemoteException occurred in server thread (ClassNotFoundException)

java - EntityManagerFactory 已关闭 - 仅在特定机器上

java - 如何防止使用 JPA 保存子对象?

java - 奇怪的延迟加载异常

java - JPA实体设计建议

java - JPA 条件谓词条件