Запросы Hibernate Named предварительно скомпилированы в истинном смысле?

Предварительно скомпилированные запросы скомпилированы и предварительно кэшированы поставщиком БД (например, oracle, sql-сервер и т.д.), чтобы они могли быть быстрее для последовательных вызовов, таких как подготовленное утверждение.

В Hibernate Именованные запросы, как говорят, предварительно скомпилированы при запуске веб-сервера. Означает ли это, что все запросы запускаются при самом запуске сервера, так что они могут быть предварительно скомпилированы поставщиком БД или предварительная компиляция имеет другое значение в контексте спящего режима?

Ответ 1

  1. Запросы Hibernate Named выражаются на языке объектных запросов (JPQL или HQL), поэтому Hibernate должен сначала перевести их на SQL. Именованные запросы хранятся в NamedQueryRepository, и каждый запрос представлен NamedQueryDefinition.

    Поскольку пользователь может динамически добавлять фильтры, ограничения результатов запросов, блокировки и подсказки, Hibernate не может предварительно скомпилировать HQL/JPQL до времени выполнения.

  2. Hibernate также использует PreparedStatement для каждого оператора SELECT и DML, поэтому вы также можете получить предварительную компиляцию оператора базы данных, если драйвер JDBC поддерживает его и не эмулирует фазу подготовки, мультиплексируя подготовку и выполнение в одном запросе к базе данных (например, MySQL, PostgreSQL).