JPQL构造函数执行需要很长时间

时间:2017-07-26 12:27:59

标签: java sql jpa jpql

我在我的代码中使用JPQL构造函数。它涉及大量结果,检索到5024个数据以及执行此查询时创建的对象。完成执行大约需要2分钟。执行此查询涉及多个表。我不能去缓存,因为数据库数据每天都会更新。有没有办法优化执行速度?

我的SQL查询形成是这样的,

String sql = "SELECT DISTINCT "
                  + "new com.abc.dc.entity.market.LaptopData(vd.segment.id, vd.segment.segmentGroup, "
                  + "vd.segment.segmentName, vd.segment.category, "
                  + "vd.product.make, vd.product.model, vd.product.modelYear) "
                  + "FROM LaptopData vd, Profile p "
                  + "WHERE vd.profile.profileCode = :profileCode "
                  + "AND vd.pk.profileId = p.id "
                  + "Order By vd.segment.segmentGroup, vd.segment.segmentName, vd.product.make, vd.product.model,"
                  + " vd.product.modelYear asc";
Query query = em.createQuery(sql);
query.setParameter("profileCode", profileCode);

@SuppressWarnings("unchecked")
List<LaptopData> results = query.getResultList();

em.clear();
return results;

1 个答案:

答案 0 :(得分:0)

嗯,有一个选项是创建单独的表,其中包含所有实体的查询结果,并每天(每晚)更新它,然后在这个新表上运行查询,如下所示:

"SELECT DISTINCT"
              + "new com.abc.dc.entity.market.LaptopData(m.id, m.segmentGroup, "
              + "m.segmentName, m.category, "
              + "m.make, m.model, m.modelYear) "
              + "FROM someNewTable m"
              + "WHERE m.profileCode = :profileCode ";

这样,您不必在每次执行查询时都进行连接和排序,而是每天只生成一次新表。有了这种查看数据更新的方法,你必须等到重新创建新表。

此外,您可以在 where 子句中的字段上创建索引。

相关问题