Hibernate hql和标准sql哪个执行时间更快?

Hibernate hql和标准sql哪个执行时间更快?,hibernate,hql,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

这两个代码段中哪一个响应最快:

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 hql=“来自groupmenu=:gm”的菜单;
Query Query=sessionFactory.getCurrentSession().createQuery(hql);
query.setParameter(“gm”,criteres.get(“gmnu_代码”);
@抑制警告(“未选中”)
List listMenu=(List)query.List();
或:

String sql=“从gmnu\u code=:gm的菜单中选择菜单id”;
Query Query=sessionFactory.getCurrentSession().createSQLQuery(sql);
query.setParameter(“gm”,criteres.get(“gmnu_代码”);
@抑制警告(“未选中”)
List listMenu=(List)query.List();

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


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

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


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

我猜执行的第二个查询不会与您发布的代码一起工作。没有将SQL结果映射到菜单实体的逻辑

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

但是

若您只检索ID,那个么您将陷入N+1查询问题。因此,它首先获取所有id,然后为每个id检索实体的所有字段。在这种情况下,纯SQL速度较慢,因为N+1个实DB查询而不是hibernate生成的一个大查询


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

我猜执行的第二个查询不会与您发布的代码一起工作。没有将SQL结果映射到菜单实体的逻辑

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

但是

若您只检索ID,那个么您将陷入N+1查询问题。因此,它首先获取所有id,然后为每个id检索实体的所有字段。在这种情况下,纯SQL速度较慢,因为N+1个实DB查询而不是hibernate生成的一个大查询


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

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


将hql转换为sql时,将检索具有EAGERfetch类型的所有列。HQL本身不允许您指定列。

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


将hql转换为sql时,将检索具有EAGERfetch类型的所有列。HQL本身不允许您指定列。

为什么不试试呢?在实践中,很可能不会有显著的差异。但当表包含更多行时,会有差异吗?它不会测量数据库中有多少列,在当前情况下唯一的区别是,在第一种情况下,HQL将被解析并转换为本机SQL,正如@Jesper所说的,在第二种情况下,大部分利润都很小。你们为什么不试试呢?在实践中,很可能不会有显著的差异。但当表包含更多行时,会有差异吗?它不会测量数据库中有多少列,在当前情况下唯一的区别是,在第一种情况下,HQL将被解析并转换为本机SQL,而且它将持续生产,正如@Jesper所说的,第二种情况下的大部分利润将非常小。
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();