【问题标题】:FETCH JOIN maximum depth?FETCH JOIN 最大深度?
【发布时间】:2012-03-12 17:35:42
【问题描述】:

W 试图获取超过三个级别的连接:

JOIN FETCH entity1.collection1.collection2  // two OneToMany relations

但是得到了:

org.hibernate.HibernateException: Errors in named queries: [...]

是因为它太深,还是因为无法以这种方式获取集合的集合?如果相关的话,我的最大获取深度是 3。

同时,我可以从另一边开始执行三重 JOIN FETCH:

JOIN FETCH entity3.entity2.entity1  // two ManyToOne relations

不知何故,我在 JPA 规范或 Hibernate 文档中找不到任何会限制该子句深度的内容。

【问题讨论】:

  • 请包含异常信息。通常,它会告诉错误的原因。
  • 真的没什么可介绍的;堆栈跟踪被 Glassfish 剪切,最上面的异常是“无法构建 EntityManagerFactory”,由我上面引用的异常引起。

标签: java hibernate jpa hql jpql


【解决方案1】:

collection1 的类型为 CollectionCollection 没有 collection2 字段。这就是我对这类查询的推理方式。

您必须在集合上创建显式连接:

select e from Entity1 e
left join fetch e.collection1 as c1
left join fetch c1.collection2 as c2

请注意,这将产生一个笛卡尔积,因此可能会返回大量行。另请注意,仅当两个集合中的一个至少是一个集合时才有可能。如果它们都是包,Hibernate 会在执行查询时抛出异常。

【讨论】:

  • 但是collection2不是从Entity1中引用的;它是 Collection1 字段之一:List<Collection2> collection2。因此查询不正确。
  • 我认为您不能使用别名进行连接提取,所以left join fetch e.collection1left join e.collection1 as c1
猜你喜欢
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 2018-04-14
  • 2015-06-08
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多