Оптимизированы ли Hibernate именованные HQL-запросы (в аннотациях)? - PullRequest
6 голосов
/ 15 апреля 2010

Новый коллега только что предложил использовать именованные HQL-запросы в Hibernate с аннотациями (например, @NamedQuery) вместо встраивания HQL в наши классы XxxxRepository.

Что мне хотелось бы знать, так это то, дает ли использование аннотации какие-либо преимущества, кроме централизации запросов?

В частности, есть ли прирост производительности, например, потому что запрос анализируется только один раз, когда класс загружается, а не каждый раз, когда выполняется метод Repository?

Ответы [ 4 ]

8 голосов
/ 15 апреля 2010

из Pro EJB 3 (Майк Кит):

"... мы рекомендуем именованные запросы, когда это возможно. Поставщики персистентности часто предпринимают шаги для предварительной компиляции именованных запросов JPQL в SQL как часть фазы развертывания или инициализации приложения."

Хотя эта книга посвящена JPA, общие рекомендации применимы к Hibernate. Однако, поскольку кэши Hibernate анализировали HQL / JPQL, вы, вероятно, не увидите большого прироста производительности. Другое преимущество использования именованных запросов состоит в том, что он дает вам возможность переопределить запрос, используя файл сопоставления во время развертывания, без необходимости перестраивать ваше приложение; полезно, если вам нужно настроить запрос в рабочей среде.

5 голосов
/ 15 апреля 2010

Помимо любого возможного прироста производительности, я считаю, что еще одним преимуществом будет то, что с помощью HQL-запросов с аннотациями вы можете защитить себя от атак SQL-инъекций.

Для веб-приложения это важно, если запрос содержитлюбые пользовательские входные данные.

http://en.wikipedia.org/wiki/SQL_injection

3 голосов
/ 09 марта 2011

Комментарий Ларса относительно внедрения SQL потенциально вводит в заблуждение, хотя я не думаю, что это было его намерением, и я хотел предоставить немного больше контекста, чтобы комментарий не был неправильно понят.

Это правда, что именованные запросы параметризованы в соответствии со спецификацией, и использование именованных параметров является одним из шагов в защите от внедрения SQL. Тем не менее, он не полностью защищает от внедрения SQL (обратитесь к его ссылке для получения дополнительной информации). Формулировка комментария предполагает, что использование именованных запросов является единственным необходимым шагом в защите от атак с использованием инъекций. В действительности, обычные запросы могут (и должны) параметризоваться и будут обеспечивать такой же уровень изоляции от атаки с использованием инъекций, что и именованные запросы, а параметризация ваших запросов - это только один из ряда необходимых шагов для предотвращения атак с использованием инъекций.

Чтобы добавить к комментарию Ларса о веб-приложениях, обратите внимание, что важно очищать данные для защиты от атак с использованием инъекций независимо от того, обращено ли приложение на внешнюю сторону или нет, а также от того, являются ли входные данные от пользователя или из другой базы данных даже в ту же базу).

2 голосов
/ 02 октября 2011

Лично я считаю, что прирост производительности менее важен, чем тот факт, что ваши hql-запросы анализируются во время запуска сервера, предоставляя вам мгновенные сообщения, если ваш hql-запрос неверен.

Я предпочитаю ловить эти ошибки перед тестированием, а не во время.

В прошлый раз во время тестирования я столкнулся с запросом в коде, который не работал, фактически никогда не работал из-за CaSiNg. Это сразу стало бы очевидным при запуске сервера при использовании именованных запросов.

И, конечно же, мне не нравится, когда мой HQL смешивается с кодом Java.

...