执行本机查询时,Hibernate要快得多

时间:2009-12-03 19:51:08

标签: java hibernate hql

以下查询应该返回大约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();

上述查询返回的时间不到一秒。

为什么会有差异?

2 个答案:

答案 0 :(得分:6)

原始问题是由AUser的财产引起的(由HappyEngineer在评论中确认)。

回答后续问题:

通常,最好的方法是将关联映射为惰性:

@ManyToOne(fetch = FetchType.LAZY)
private Company company;

然后,您可以使用join fetch

覆盖查询中的提取模式
select user
  from AUser user left join fetch user.company
 where user.company.id = :companyId

有关详细信息,请参阅Hibernate文档中的Associations and Joins一章。

答案 1 :(得分:1)

这可能是Hibernate中的n + 1选择问题。您应该遵循一些最佳实践来提高查询性能。有很多选项,如延迟加载,获取模式,获取加入等。

http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html n + 1查询问题

...问候