一尘不染

JPA / Hibernate的最大连接数?

hibernate

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_将其包含在结果中,事实并非如此。

编辑2:
记录为未修复的Hibernate错误HHH-3035的类似问题

编辑3:
这是已记录的Hibernate错误HHH-3636,已修复,但尚未成为任何发行版的一部分。

编辑4: 我建立了hibernate-core 3.3.2-SNAPSHOT,其中包括错误修复程序HHH-3636,但它没有解决此问题。

编辑5: 错误行为似乎是由LEFT JOIN FETCHManyToMany或OneToMany关系上的多个事件触发的。一个会起作用,两个或三个会导致该错误。

编辑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。


阅读 572

收藏
2020-06-20

共1个答案

一尘不染

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

您是否考虑过其他方法?有关提高性能的文档提出了一些建议。

2020-06-20