【发布时间】:2013-10-14 13:42:26
【问题描述】:
我在使用 Criteria 和 left join 时遇到了性能问题。以下是我的查询:
Criteria crit = session.createCriteria(CuttingAssignment.class);
crit.add(Restrictions.eq("cuttingMachine", cuttingMachine));
crit.createAlias("cuttingBatch", "cuttingBatch");
crit.addOrder(Order.asc("psn"));
crit.setFetchMode("cuttingBatch", FetchMode.JOIN);
crit.setFetchMode("cuttingMachine", FetchMode.JOIN);
crit.createAlias("cuttingBatch.isolatingBatches", "cuttingBatch.isolatingBatches", Criteria.LEFT_JOIN);
crit.createAlias("cuttingBatch.isolatingBatches.assignments", "cuttingBatch.isolatingBatches.assignments", Criteria.LEFT_JOIN);
crit.createAlias("cuttingBatch.articleType", "cuttingBatch.articleType");
crit.setFetchMode("cuttingBatch.articleType", FetchMode.JOIN);
crit.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
List<CuttingAssignment> cuttingAssignmentList = crit.list();
现在它会在数据库中执行这么多的 sql 查询,因为我面临性能问题?
优化 Criteria Query 的方法有哪些?条件和HQL查询有什么区别吗?
提前致谢。
【问题讨论】:
-
您应该首先检查hibernate发送的SQL请求。例如参见stackoverflow.com/questions/1710476/…。然后检查您是否有正确的 JOIN 索引。
-
您是否通过调高日志级别检查了用于此查询的 SQL,然后尝试使用 EXPLAIN PLAN 手动执行它。