Java 休眠按计数排序的联接表和POJO的返回列表

Java 休眠按计数排序的联接表和POJO的返回列表,java,mysql,performance,hibernate,left-join,Java,Mysql,Performance,Hibernate,Left Join,假设有一个实体包含另一个实体的集合 @Entity public class OneEntity { @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) private Set<AnotherEntity> anotherEntities; } is占用我大约0.3秒的时间,因此我有(例如)下一个表和下一个字段: 一个实体ID 一个实体名 一实体描述 另一个实体计数 现在我想使用hibe

假设有一个实体包含另一个实体的集合

@Entity
public class OneEntity {

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Set<AnotherEntity> anotherEntities;

}
is占用我大约0.3秒的时间,因此我有(例如)下一个表和下一个字段:

  • 一个实体ID
  • 一个实体名
  • 一实体描述
  • 另一个实体计数
现在我想使用hibernate执行此操作,我在谷歌上搜索了这样的解决方案:

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秒内查询一个按Anotherity计数排序的实体并获得一个实体的列表(不包含Anotherity集合)?

我想可以使用hql查询,类似这样:

EntityManager em = ....
Query q = em.createQuery("SELECT new HashMap<e,COUNT(e.id)> FROM OneEntity e ... GROUP BY e.id");
q.getResultList();
EntityManager em=。。。。
Query q=em.createQuery(“从一个实体e中选择新HashMap…按e.id分组”);
q、 getResultList();

它将返回一个地图列表。希望对您有用。

我使用hibernate条件,因为查询中可能有多达7个参数(例如名称、描述、一些布尔值等)用于查询。是的,当然,我可以手动构建查询(可能会产生bug、sql注入等),但可能有使用条件的解决方案吗?
EntityManager em = ....
Query q = em.createQuery("SELECT new HashMap<e,COUNT(e.id)> FROM OneEntity e ... GROUP BY e.id");
q.getResultList();