Java JPA/Hibernate连接的最大数量?

Java JPA/Hibernate连接的最大数量?,java,hibernate,jpa,join,Java,Hibernate,Jpa,Join,JPA/Hibernate查询中允许的联接数量是否有限制 自Hibernate以来,我必须在JPA/Hibernate查询中显式指定连接。例如,人有地址,地址有状态。以下查询检索地址和状态已完全加载的人员: select p, a, s from person p left join p.address a left join a.state s where ... 随着我不断添加连接,我最终(在12-13次左连接之后)达到了一个极限,Hibernate会生成无效的SQL: Caused by

JPA/Hibernate查询中允许的联接数量是否有限制

自Hibernate以来,我必须在JPA/Hibernate查询中显式指定连接。例如,人有地址,地址有状态。以下查询检索地址和状态已完全加载的人员:

select p, a, s from person p left join p.address a left join a.state s where ...
随着我不断添加连接,我最终(在12-13次左连接之后)达到了一个极限,Hibernate会生成无效的SQL:

Caused by: java.sql.SQLException: Column 'something69_2_' not found. 
我的数据库实现MySQL设置了Hibernate的方言:

<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
但是,
something69\u 2\u
不会出现在SQL查询中。这就像Hibernate生成了一个SQL查询,并期望结果中出现
something69\u 2\u
,但结果并非如此

编辑2:类似问题记录为

编辑3:这是一个有文档记录的版本,已经修复,但还不是任何版本的一部分

编辑4:我构建了hibernate core 3.3.2-SNAPSHOT,其中包括错误修复HHH-3636,但没有解决这个问题

编辑5:错误行为似乎是由多个
左连接获取
在多个或一个多个关系上触发的。一个会起作用,两个或三个会导致错误

编辑6:以下是堆栈跟踪:

javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute query
        at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:629)
        at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:73)
Caused by: org.hibernate.exception.SQLGrammarException: could not execute query
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
        at org.hibernate.loader.Loader.doList(Loader.java:2214)
        at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2095)
        at org.hibernate.loader.Loader.list(Loader.java:2090)
        at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:388)
        at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
        at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
        at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
        at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
        at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:64)
        ... 69 more
Caused by: java.sql.SQLException: Column 'something69_2_' not found.
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
        at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1136)
        at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2777)
        at org.hibernate.type.IntegerType.get(IntegerType.java:28)
        at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:113)
        at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:102)
        at org.hibernate.loader.Loader.getKeyFromResultSet(Loader.java:1088)
        at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:553)
        at org.hibernate.loader.Loader.doQuery(Loader.java:689)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
        at org.hibernate.loader.Loader.doList(Loader.java:2211)
        ... 77 more

编辑7:所有这些联接的原因是为了避免Hibernate执行n+1查询,请参见

Hibernate代码中没有限制联接数量的内容。这可能是方言中的错误,或者是数据库引擎的限制。但是我的钱在一个与加入人数无关的bug上!您是否尝试过在交互式查询会话中直接运行SQL?

我曾经使用Hibernate达到MySQL 5.0 61表的限制:

ERROR 1116 (HY000): Too many tables; MySQL can only use 61 tables in a join
错误1116(HY000):表格太多;MySQL在连接中只能使用61个表您是否尝试使用实际使用的jdbc驱动程序执行?这可能是jdbc驱动程序的问题


虽然从专栏的名称来看,它是在寻找,但我猜有些名称的修饰/构造出现了错误。显然,它看起来更像一个bug,而不是一个预期的限制

问题是,您为什么要首先尝试进行如此复杂的查询

你考虑过不同的方法吗?上的文档提供了一些建议。

是否对所有内部联接使用别名?使用这些别名?当您尝试在
SELECT
子句中使用隐式别名来执行类似操作时,我在Hibernate中看到了一些非常奇怪的行为(非常简单的示例):

但是,如果您显式地声明所有别名,它就可以正常工作。像这样:

select s from person p join p.address a join a.state s
。。。甚至这个:

select s from person p join p.address.state s

SQL查询工作正常。问题是Hibernate试图读取一个不存在的结果字段。只是好奇,您的JPA查询中的where子句有多复杂?where子句并不重要。我尝试了1)无where子句,2)简单where子句(其中id=1)。为什么不使用subselect fetch而不是join then?如果没有join,Hibernate将进行n+1查询,导致性能非常差。看见
select s from person p join p.address a join a.state s
select s from person p join p.address.state s