【问题标题】:Performace issues with Hibernate Criteria + joinHibernate Criteria + join 的性能问题
【发布时间】: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 手动执行它。

标签: java hibernate criteria


【解决方案1】:

是的,HQL 比标准更有效、更简单。如果不懂 SQL,我可以用 Criteria 查询理解,但总的来说我更喜欢 HQL。

【讨论】:

  • 这有点笼统,并不总是适用。这将取决于具体情况,因为我认为编写糟糕的 HQL 很容易被标准查询所超越。
【解决方案2】:

请发布您的 HSQL 以进行比较。一般来说,HSQL 只会向数据库发送一条语句,而 Criteria API 可能会发送多条语句,具体取决于惰性关联的数量。如果您想使用外连接在一个查询中获取惰性关联,请查看Criteria Query 第 15.5 段

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 2012-02-02
    • 2014-01-03
    • 1970-01-01
    相关资源
    最近更新 更多