Hibernate命名查询是否是真正意义上的预编译?

预编译的查询由DB供应商(如oracle,sql server等)预先编译和缓存,以便它们可以更快地进行连续调用,如预处理语句。

在Hibernate命名查询据说是在Web服务器启动时预编译的。 这是否意味着所有查询都在服务器启动时触发,以便它们可以由DB供应商预编译或预编译在hibernate上下文中具有不同的含义?

  1. Hibernate Named查询以对象查询语言(JPQL或HQL)表示,因此Hibernate需要首先将它们转换为SQL。 命名查询存储在NamedQueryRepository中 ,每个查询由NamedQueryDefinition表示。

    因为用户可以动态添加filter,查询结果限制,锁和提示,所以Hibernate在执行时间之前无法预编译HQL / JPQL。

  2. Hibernate还为每个SELECT和DML语句使用PrepartedStatement ,因此如果JDBC驱动程序支持它,您也可以获取数据库语句预编译,并且不通过在单个数据库请求中复用prepare和execute来模拟准备阶段(例如,MySQL,PostgreSQL )。