【问题标题】:When Hibernate does not generate optimal query. How to make hibernate generate optimal query当 Hibernate 不生成最优查询时。如何让hibernate生成最优查询
【发布时间】:2025-12-02 08:40:01
【问题描述】:

虽然像 hibernate 这样的 ORM 框架确实简化了在 RDBMS 中访问和修改数据的活动。如果使用得当,它的延迟加载、缓存等功能也有助于提高应用程序性能。
但我在想的是,如果查询生成器或优化器没有使用最佳查询 - 比如说在连接期间没有遵循正确的表顺序,也没有使用最合适的连接策略等。
我怎么能优化查询或说休眠以生成比默认生成的查询更优化的更好查询。

(如果我没记错的话,这个问题也适用于 iBATIS 等其他 ORM 框架)

根据 S. Bhattacharjee 的回答编辑 - 我也希望 Hibernate 能够生成最佳查询。但另一方面,即使在 Oracle GUI 中使用 Oracle SQL 执行器,有时优化器也不会使用最优计划。但我可以通过更具体地编写查询来影响它。 (不要问我是怎么做的,知道的请指出。我不是SQL专家,我需要分析这个案例,以确保系统的灵活性和优化不受框架的限制)。所以
案例 1 - 考虑休眠没有生成最佳查询。那么如何影响它以生成最佳查询。
CASE 2 - hibernate 正在生成最佳查询。但是 SQL 引擎正在使用一个不是最优的计划。查询和计划(或执行)与我的理解不同。我不确定这是否是一个有效的案例。因此,如果不适用,请忽略。但如果有人认为这是一个有效的案例,即使他们无法回答,请发表评论以支持这一点。

接下来谈到 Hibernate 查询生成器 - 我想到了另一个问题。 Hibernate 是否知道 DB 的逻辑结构(我不希望它知道物理设计,因此在这里考虑它可能无关紧要)。
a) 如果它知道逻辑数据库设计,它是如何知道的。
b)如果它不知道逻辑数据库设计,那么它如何确定查询是最优的。

【问题讨论】:

    标签: java database oracle hibernate orm


    【解决方案1】:

    嗯,在我看来,hibernate 会生成一个很好的优化查询。请更清楚您所说的理由是什么,可以举个例子吗?但是,如果您愿意,您可以编写自己的 SQL 查询。下面是一个很小的例子

    Query query = session.createSQLQuery("select c.codename from 
    codes c where c.code = :paramcode")
    .setParameter("paramcode", "900");
    List result = query.list();
    

    【讨论】:

    • 对你对休眠的信心非常好,但我仍然想至少从理论上看它,以及是否有可能在查询生成中影响休眠。而且我知道添加本机续集代码,但这不是我在这里寻找的。​​span>
    • 谢谢,如果有正面的事情我也会期待的!!