Оптимизированы ли Hibernate именованные запросы HQL (в аннотациях)?

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

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

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


person Graham Lea    schedule 15.04.2010    source источник
comment
и я предпочитаю критериальные запросы обоим из них...   -  person NimChimpsky    schedule 06.06.2012


Ответы (4)


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

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

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

person Ken Liu    schedule 15.04.2010

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

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

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

person Lars Andren    schedule 15.04.2010

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

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

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

person Martin Smith    schedule 09.03.2011

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

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

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

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

person Maarten van Leunen    schedule 02.10.2011