Модель запуска hql-запроса? - PullRequest
1 голос
/ 27 декабря 2010

Я хочу понять, как hibernate выполняет hql-запрос внутренне или в других моделях, как работает механизм hql-запросов. Пожалуйста, предложите несколько хороших ссылок для того же?

Одной из причин для чтения является следующая проблема.

    Class Branch
    {

          //lazy loaded
          @joincolumn(name="company_id")
          Company company;
    } 

Так как компания является тяжелым объектом, она загружается лениво.

теперь у меня есть запрос hql

       "from Branch as branch where branch.Company.id=:companyId"

Меня беспокоит то, что если для запуска вышеупомянутого запроса движок hql должен извлечь объект компании, то это снижает производительность, и я бы предпочел добавить еще одно свойство в класс Branch, т.е. Таким образом, в этом случае запрос hql будет

    "from Branch as branch where branch.companyId=:companyId"

Если механизм hql сначала генерирует sql из hql, а затем запускает сам запрос sql, то проблем с производительностью не должно быть.

Пожалуйста, дайте мне знать, если проблема не понятна.

1 Ответ

1 голос
/ 27 декабря 2010

Меня беспокоит то, что если для запуска вышеупомянутого запроса, движок hql должен извлечь объект компании , то его производительность снизится до

Поскольку вы хотите просто использовать идентификатор компании (в простом SQL, один внешний ключ), механизм Hibernate достаточно умен для использования внешнего ключа компании без загрузки сущности компании

Но ...

Это просто работает при использовании стратегии доступа к свойству . С другой стороны, вы должны настроить свою сущность, поместив каждую связанную с JPA аннотацию прямо над методом получения (вместо поля - как показано в вашем примере). Это происходит потому, что Hibernate скрытно использует прокси , подклассифицируя ваши сущности . Например, если вы используете поле с именем id, инкапсулированное свойством userName (да, это возможно), например

 @Id
 private String id;

 public String getUserName() { return this.id; }
 public void setUserName(String userName) { this.id = userName; }

Поскольку логика, используемая Hibernate для управления вашими сущностями , помещена в свойства его подкласса , Как может Hibernate предположить, что свойство userName инкапсулирует поле с именем id ???

Так что, если вы хотите избежать загрузки Company, используйте взамен стратегию доступа к свойству.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...