以下查询应该返回大约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();
上述查询返回的时间不到一秒。
为什么会有差异?
答案 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查询问题
...问候