当前位置: 首页 > 面试题库 >

为什么Hibernate有时会忽略FetchMode.JOIN?

毋宸
2023-03-14
问题内容

我有一个带有@ManyToOne关系的实体,我想通过一个查询来检索它,因此使用@Fetch(FetchMode.JOIN)。有时,Hibernate不尊重它,而是发出N
+ 1 SELECT秒。随着 有时 我的意思是,因为我不知道是什么触发它,我有案件对不同的查询,这可能发生,或者不一样的类。

这是带有我使用的注释的简化实体:

@Entity
public class Employee {

    @ManyToOne
    @Fetch(FetchMode.JOIN)
    private Department department;

}

CriteriaQuery<Employee> criteriaQuery = criteriaBuilder.createQuery(Employee.class);

Root<Employee> root = criteriqQuery.from(Employee.class);

TypedQuery<Employee> typedQuery = entityManager.createQuery(criteriaQuery);

List<Employee> employees = typedQuery.getResultList();

我希望单个查询能够同时获取Employee其及其内容Department,例如

select ... from Employee join Department on ...

相反,我得到了第一选择所有N EmployeeS和那么N SELECT献给所有DepartmentS(考虑没有缓存)。

我发现了许多类似的问题,但是他们的回答提出了解决方法,但没有解释为什么会这样。请避免出现建议使用延迟加载的答案:这不是我要的。


问题答案:

规则很简单:查询会忽略获取模式。当您编写查询时,您在说什么已联接和什么未联接。

仅当实体使用类似方法加载时,EntityManager.find(class, id)或在其他实体图中导航并加载其关联时,才考虑使用提取模式。



 类似资料:
  • 问题内容: 我正在尝试在包级别使用Hibernate @TypeDef批注,这与Hibernate文档中所描述的完全相同。我正在使用和。代码可以编译,并且在类路径中,但是Hibernate仍然看不到它。 如果我上课,那是行得通的,但是如果我把放在那,那是没有用的。我试图用Google搜索,但找不到任何有用的信息。 谢谢! 问题答案: 您可能需要添加一个 到您的Hibernate配置文件,或调用co

  • 我对iOS布局约束的机制有误解。请参阅下面列出的我放在viewDidLoad中的代码。 在我看来,我的意图是明确的。我想在设备屏幕的中央看到一个按钮。但我只能看到下面的图片。 我在项目控制台中有一个输出,非常可怕,我无法从中理解任何东西。 无法同时满足约束。可能以下列表中至少有一个约束是您不想要的。尝试以下方法:(1)查看每个约束,并尝试找出您不期望的约束;(2) 查找添加了一个或多个不需要的约束

  • 问题内容: 这个问题是由我前段时间给出的答案引起的。 假设我有一个这样的数据框 我想,以取代由最大行的,我可以做 这给了我想要的输出 但是,当我使用 由于某种原因,仅在以下三种情况中的两种情况下才可以正确更换它: 确实,如果我亲自检查 然后打印 做的时候 它打印预期的 我的问题是,为什么在三种情况中有一种失败了,但在全部3种情况中都没有失败? 问题答案: 原因是通过将第一个值作为“到目前为止看到的

  • 问题内容: 与这两个帖子@iMohammad有关, 在单击JButtonJava时使用JButton增加/减少textArea内的字体大小并在单击JButton Java时更改字体样式 …,我面临着一个非常有趣的问题,该问题来自于on 作为参数传递屏幕 请如何动态调整大小取决于,与我在sscce中尝试过的另一个JComponent正常工作一样 问题答案: 我调试了您的SSCCE,并且传递给的值为空

  • 问题内容: 我将Spring 3.1.3用于Web应用程序,将XML配置与组件扫描结合使用。 我意识到,其中一个扫描组件必须在其他几个组件之前进行初始化。在所有需要构造后初始化的类上,我在方法上具有@PostConstruct批注。 为了设置依赖关系顺序,我在需要先后构造的类上将“ @Component”更改为“ @Component(“ configData”)”。然后,在每个需要在“ conf

  • 问题内容: 我的意图是获得客户的分页结果集。我正在使用Tom的这种算法: 我还在“客户”列中定义了一个索引。“ FIRST_NAME”: 该查询返回了预期的结果集,但是从说明计划中,我注意到未使用该索引: 我正在使用Oracle 11g。由于我只查询前20行(按索引列排序),因此我希望使用索引。 为什么Oracle优化器会忽略索引?我认为分页算法有问题,但是我不知道是什么。 谢谢。 问题答案: 您