假设我有一个包含另一个实体集的OneEntity
@Entity
public class OneEntity {
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Set<AnotherEntity> anotherEntities;
}
就目前而言,我在OneEntity中大约有30000行,在AnotherEntity中大约有500000行,一些OneEntities具有10-100个AnotherEntity,但是其中一些具有1000个甚至更多(这很重要)
现在我想以最快的速度获得前20个具有最大AnotherEntities计数的OneEntities(但如果没有AnotherEntities数据,则set将为空,就像我使用惰性集合一样)。
Hibernate创建3个表:OneEntity,OneEntity_AnotherEntity,AnotherEntity。
当我在mysql控制台中处理查询时
SELECT *, COUNT(anotherEntityId) as anotherEntityCount from OneEntity left join OneEntity_AnotherEntity on OneEntity.oneEntityId = OneEntity_AnotherEntity.oneEntityId group by OneEntity.oneEntityId order by anotherEntityCount desc limit 0,20;
是花了我大约0.3秒,因此我(例如)具有下一个字段的下一张表:
oneEntityId;
oneEntityName;
一个实体描述;
anotherEntityCount;
现在我想使用休眠来执行此操作,我用谷歌搜索了这样的解决方案:
criteria.createAlias("anotherEntities", "anotherEntity");
criteria.setProjection(Projections.projectionList().add(Projections.groupProperty("oneEnityId")).add(Projections.count("anotherEntity.anotherEntityId"), "anotherEntityCount"));
criteria.addOrder(Order.desc("anotherEntityCount"));
但在这种情况下,我获得下一个数组:
[
[
427636,
52268
],
[
645779,
47529
],
and so on...
]
它需要我13!秒(在MySQL控制台中为0.3秒)
问题-我怎么能在不到13秒的时间内查询由AnotherEntity计数排序的OneEntity并获得OneEntities列表(其中不包含anotherEntities集)?
最佳答案
我猜可以使用hql查询,如下所示:
EntityManager em = ....
Query q = em.createQuery("SELECT new HashMap<e,COUNT(e.id)> FROM OneEntity e ... GROUP BY e.id");
q.getResultList();
它将返回一个Map列表。希望对你有效。