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

时间:2017-08-08 10:57:30

标签: hibernate hql

这两个片段中的哪一个响应速度最快:

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();

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

我猜第二个执行查询将无法使用您发布的代码。将SQL结果映射到Menu实体没有逻辑。

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

但是...

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

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

答案 2 :(得分:0)

在您的示例中,sql ond hql之间存在一个区别。通过sql,您只能获取您真正需要的列。

当hql被翻译为sql时,将检索具有 EAGER 获取类型的所有列。 HQL本身不允许您指定列。