执行时间哪个更快:hql 还是标准 sql?

Which is faster in execution time : hql or standard sql?

这两个片段中哪个响应最快:

String hql = "from Menu where groupeMenu = :gm";
Query query = sessionFactory.getCurrentSession().createQuery(hql);
query.setParameter("gm" , criteres.get("gmnu_code"));
@SuppressWarnings("unchecked")
List<Menu> listMenu = (List<Menu>) query.list();

或:

String sql = "select menu_id from menu where gmnu_code = :gm";
Query query = sessionFactory.getCurrentSession().createSQLQuery(sql);
query.setParameter("gm" , criteres.get("gmnu_code"));
@SuppressWarnings("unchecked")
List<Menu> listMenu = (List<Menu>) query.list();

通常底层数据库只接受sql请求,你甚至可以要求spring显示生成的查询。不同的是,当你使用hql时,你依赖spring解析记录集给你对象,而当你使用原始SQL时,你必须说如何处理记录集。

这意味着从数据库的角度来看根本没有区别(对于这样一个简单的查询,hql 将在示例中翻译 sql)。在客户端上,这取决于您是否可以生成比 spring 生成的代码更优化的代码。好问题只是它是否值得,因为最终你会得到更多的代码来生产测试和维护。一个经验法则是,除非您在特定查询中遇到性能问题,否则 hql 是最好的方法,并且 raw SQL 应该只用于特定的用例。

我想执行的第二个查询不适用于您发布的代码。没有将 SQL 结果映射到菜单实体的逻辑。

通常情况下,纯 SQL 速度更快,尤其是在复杂查询的情况下。 Hibernate 无论如何都会从实体生成 SQL,有时生成的查询可能非常复杂(特别是如果您有急切的关系)。

但是...

如果您只检索 ID,则会遇到 N+1 查询问题。所以它首先获取所有 id,然后为每个 id 检索实体的所有字段。在这种情况下,纯 SQL 速度较慢,因为 N+1 个真实的数据库查询而不是休眠生成的一个大查询。

因此您可以使用 JDBC 模板到 运行 纯 SQL 并添加行映射器以将结果映射到实体。但是如果你需要的不仅仅是简单的阅读(例如你需要更新所有实体)那么使用 HQL 似乎更合理。

您的示例中 sql 和 hql 之间有一个区别。通过 sql 你可以只获取你真正需要的列。

虽然 hql 被翻译成 sql,但所有具有 EAGER 提取类型的列都将被检索。 HQL 本身不允许您指定列。