当前位置: 首页 > 面试题库 >

JPA / Hibernate的最大连接数?

庾奇思
2023-03-14
问题内容

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。


问题答案:

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

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



 类似资料:
  • 我的本机查询将类似于:“select*from a inner join b inner join c on a.ida=b.idb and b.lastname=c.lastname and a.name=c.name” 在hibernate中,如果要连接两个表,可以使用@joincolum,如果要通过表B连接表A和表C,可以使用@joincable。 因此在HQL中查询将看起来像:“from

  • 嘿,我正在使用Glassfish开源v4,我遇到了一个奇怪的问题。 我在管理控制台中定义了到Oracle 11g的JDBC连接池,并设置了: 初始和最小池大小:500 最大游泳池大小:1000 池大小调整数量::750 我已经为这个连接池创建了一个特定的用户。然而,有时当我检查数据库中打开的连接时,我发现有1000多个连接(我看到的最大连接数是1440个) 当发生这种情况时,任何查询尝试都会失败,

  • 我正在使用hikari cp和spring boot应用程序,它有超过1000个并发用户。我已经设置了最大池大小- 当我使用 它显示的最大值为300,等于池大小。它永远不会增加超过最大池。这是故意的吗?我认为池大小意味着保持连接,以便在将来需要数据库请求时可以重用连接,但在需要时可以进行更多连接。 另外,当我删除max pool配置时,我会立即得到- HikariPool-0-连接不可用,请求在3

  • 问题内容: 我正在尝试编写一个MySQL查询,在其中提取卖方的信息和她最受欢迎的产品。这取决于浏览量最多的产品,即。 不过,以下查询只是拉出一种随机产品,而不是浏览量最多的产品。 或更准确地说,实际上是正确的数字,但是如何获得其他 产品字段 (id,图像,标题等)相对于具有最多页面浏览量的产品。 表数据: 卖方: 产品: 预期结果(精简): 结果应按浏览量列出经过精心挑选的卖家信息及其最受欢迎的产

  • 我需要从Rest控件获取一个实体及其集合,但我对spring data JPA有一个非常奇怪的行为。 我对带有懒惰加载的实体有一种莫名其妙的关系。

  • 因为Websockets构建在TCP之上,所以我的理解是,除非端口在连接之间共享,否则您将受到64K端口限制的约束。但我也看到过使用Gretty进行512K连接的报告。所以我不知道。