当前位置: 首页 > 知识库问答 >
问题:

JPA/Hibernate查询:急切地加载subselect

冉伯寅
2023-03-14
select * from Parent ...;
select * from Child where parent_id in ...;
// 2nd query:
criteria
.createAlias("parent", "p")
.add(Property.forName("p.id")
        .in(parentCriteria.setProjection(Projections.property("id"))))
.list();

// 2nd query (manual):
criteria
.createAlias("parent", "p")
.add(Property.forName("p.id").in(parentIdList))
.list();

我通过提示检查了它在EclipseLink中的工作情况:

query.setHint("eclipselink.batch.type", "EXISTS");

这个链接http://blog.ringerc.id.au/2012/06/jpa2-is-very-inflexible-with-eagerlazy.html暗示通过Hibernate是不可能的,建议手动获取。但是,我无法理解如何通过HQL或标准来实现它,特别是如何获得不在实体上但仅存在于数据库上的child.parent_id列。即避免由child.parent.id产生的连接。

共有1个答案

那昊
2023-03-14

若要避免n+1个查询,可以使用

@BatchFetch(BatchFetchType.JOIN)  //in eclipselink or
@BatchSize //in hibernate.

在查询内部,可以添加fetch to join子句:

select p from Parent p join fetch p.children c where ...

您还可以添加查询提示

query.setHint("eclipselink.batch", "p.children");
 类似资料:
  • 让CriteriaQuery加载多对一个关系而不明确地告诉它,我遇到了一些麻烦,而且要在查询中复制我的实体注释来使其工作,这似乎很奇怪: 除其他字段外,“我的实体计算机”包含以下关系: @ManyToOne(fetch=FetchType.Eage)@JoinColumn(name=“Employee”,nullable=false)private Employee=Null; 据我所知,当我加载

  • 我尝试实现简单的一对多关联。在使用调试模式检查item对象后,我发现已经加载了list bids。但是List bids属性是用FetchType.Lazy注释的。一些书籍和网页声称FetchType.lazy是JPA提供者接受或拒绝的提示。但我想知道JPA提供程序在什么情况下忽略FetchType.lazy。提前谢谢你。

  • 问题内容: 关于我之前的问题,我想确保所有子对象都已加载,因为我有多个线程可能需要访问数据(从而避免延迟加载异常)。我知道执行此操作的方法是在查询(EJB QL)中使用“fetch”关键字。像这样: 假设模型中包含一个类。 我的问题是,似乎需要“ distinct”关键字,否则我似乎会为每个关键字找回一个。我做对了吗? 也许更重要的是,是否有一种方法可以拉入所有子对象,无论深度如何?我们大约有10

  • 我无法在hibernate中急切地加载多态相关对象。我知道默认的FetchType渴望@Any,但我不能急于加载字段。下面是一段代码片段: 当我从hibernate通过id获取它时,会出现延迟初始化异常。我不明白为什么会这样。谁能帮忙吗?

  • 我见过几个类似的问题有0个好答案。 这应该非常简单。我正在使用 Java JPA,有时想要加载子实体列表,但不是所有时间。不幸的是,当我说要懒惰地获取它时,JPA似乎没有听我的话。我已经 100% 确定在我的代码中没有任何地方以任何方式访问 childEntities 属性。但是,在我的 JPA.em(.)查找(.)调用时,所有子实体仍然会立即加载。这就是我如何声明与注释的关系。 我是这样加载父实