假设我有一个包含另一个实体集的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列表。希望对你有效。

10-08 08:49