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.
我确实将Hibernate的方言设置为数据库实现MySQL:
<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
Hibernate在单个查询中可以处理的连接数是否有限制?
编辑1: 以下是在日志文件中:
could not read column value from result set: something69_2_; Column 'something69_2_' not found.
但是,something69_2_不会出现在SQL查询中。就像Hibernate生成了一个SQL查询,并期望something69_2_将其包含在结果中,事实并非如此。
something69_2_
编辑2: 记录为未修复的Hibernate错误HHH-3035的类似问题
编辑3: 这是已记录的Hibernate错误HHH-3636,已修复,但尚未成为任何发行版的一部分。
编辑4: 我建立了hibernate-core 3.3.2-SNAPSHOT,其中包括错误修复程序HHH-3636,但它没有解决此问题。
编辑5: 错误行为似乎是由LEFT JOIN FETCHManyToMany或OneToMany关系上的多个事件触发的。一个会起作用,两个或三个会导致该错误。
LEFT JOIN FETCH
编辑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查询时如何避免n + 1个SQL SELECT查询的Hibernate FAQ。
问题是,为什么首先要尝试进行如此复杂的查询?
您是否考虑过其他方法?有关提高性能的文档提出了一些建议。