Ответ 1
Ты испортил некоторые части. Вы можете выбрать только определенные столбцы с помощью HQL, например, вы можете использовать select column from table
в HQL.
Native SQL не обязательно быстрее, чем HQL. Наконец, HQL также переведен в SQL (вы можете увидеть сгенерированный оператор при запуске приложения с свойством show_sql
, установленным в true). В некоторых случаях Hibernate не может генерировать наиболее эффективные операторы, поэтому собственный SQL может быть быстрее - но с собственным SQL ваше приложение теряет переносимость из одной базы данных в другую, поэтому обычно лучше настроить отображение hibernate и HQL для создания более эффективных операторов SQL. С другой стороны, с родным SQL вам не хватает кэша Hibernate - как следствие, в некоторых случаях родной SQL может быть медленнее, чем HQL.
Когда вы используете session.load(class, id)
, а строка еще не находится в кеше, нагрузка также генерирует select * from classTable
, поэтому скорость аналогична скорости HQL from
. (Но когда объект уже находится в кеше, возможно, load
быстрее.)
Я не согласен с вашими рекомендациями по эффективности: в большинстве случаев для производительности это не имеет значения, если вы загружаете все столбцы или только нужные столбцы. При доступе к базе данных время при поиске строки теряется, а не при передаче данных в приложение. Когда вы читаете только необходимые столбцы, у него есть следующие недостатки:
- Если вам нужны столбцы, которые вы еще не загрузили, у вас больше проблем с изменением вашего приложения (или вам нужно снова загрузить строку, что означает низкую производительность).
- Это дает плохой дизайн вашему приложению (Hibernate предпочитает одну таблицу - один класс)
- Это не работает с кэшем Hibernate.
(Мысль, если в вашем приложении есть столбцы, которые вам никогда не нужны, или для столбцов, которые будут добавлены после завершения вашего приложения, тогда вы просто не помещаете их в свой класс и ваше сопоставление, и они никогда не будут быть загружен, и ваш дизайн приложения по-прежнему хорош. Hibernate не генерирует операторы select * from table
, он всегда генерирует select col1, col2, ... from table
.)
Есть одно исключение: если вы загружаете огромное количество данных - тысячи строк - тогда загрузка только необходимых столбцов может быть значительно быстрее.