【发布时间】:2009-12-03 19:51:08
【问题描述】:
以下查询应该返回大约 800 个对象。问题是hibernate实际上执行了800个查询来获取它们。它似乎执行一个查询以获取 id,然后为每个对象执行一个查询以获取有关该对象的特定数据。此查询需要 60 多秒才能返回。
List<AUser> result = em.createQuery("FROM AUser where company=:companyId")
.setParameter("companyId",company.getId())
.getResultList();
本机查询要快得多。
List<AUser> result = em.createNativeQuery("select a.* FROM AUser a where a.company=:companyId")
.setParameter("companyId",company.getId())
.getResultList();
上述查询不到一秒即可返回。
为什么不一样?
【问题讨论】:
-
你能将 showSql 设置为 true 并查看 HQL 被翻译成什么 SQL 吗?
-
我要在这里大胆猜测一下,说你已经在
AUser中映射了一些东西,以便急切地获取。你能发布你的映射吗?此外,请遵循 Kaleb 的建议并发布(800 条中的一些)查询。 -
正如 Kaleb Brasee 在 hibernate.properties 中建议的那样,设置 hibernate.show_sql=true 以查看 SQL 输出。
-
@ChssPly76,你是对的。我仔细查看了这些查询,并意识到它们不会进入 AUser 表(就像我最初想的那样)。它们是急切地获得的财产的结果。我想我只需要弄清楚如何为不需要这些属性的查询关闭此对象的急切获取。或者,也许有一种方法可以在一个查询中加载所有连接的属性,而不是对每个对象执行一个查询?