NHibernate - Примитивный тип с отложенной загрузкой - PullRequest
3 голосов
/ 19 января 2010

Я использую NHibernate для загрузки некоторых объектов в мое приложение ASP.NET MVC.

Например, представление отправлено пользователем, и я хочу отобразить имя пользователя (но только имя пользователя) пользователя, например:

<%= Html.Encode(item.User.UserName) %>

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

Проблема в том, что запрос SQL также выбирает другую информацию о пользователе, такую ​​как пароль, адрес электронной почты и т. Д. Эта информация явно не нужна и отбрасывается.

SQL-запрос выглядит так:

SELECT id, username, password, email FROM User WHERE Id = 1;

Я пришел к выводу, что NHibernate только ссылки с отложенной загрузкой на другие объекты, которые отображаются на таблицы в моей базе данных. Похоже, он не загружает ленивые базовые, примитивные типы, такие как строки, целые и т. Д.

Могу ли я это сделать? Когда в приведенной выше строке выбран код, я бы хотел, чтобы SQL-запрос выглядел примерно так:

SELECT username FROM User WHERE Id = 1;

Возможно ли это? Как?

Ответы [ 2 ]

1 голос
/ 19 января 2010

Есть ли причина, по которой вы не хотите загружать весь объект?За исключением редких случаев, нет реальной разницы в производительности.

Я могу понять, что не хочу загружать пароль в память, хотя он должен быть зашифрован и, вероятно, в любом случае не должен быть в модели вашего домена.В вашем случае я бы сделал подкласс User на два класса, User и UserProfile (содержащий пароль и т. Д.), Чтобы вы работали с объектом UserProfile только при управлении учетной записью пользователя.

0 голосов
/ 19 января 2010

Вам потребуется использовать resultTransformer, чтобы отобразить результат запроса на объект, который вы хотите сохранить (я понимаю, что это ваш обычный класс DTO пользователя, но за исключением всех других полей)

Проверьте это http://docs.jboss.org/hibernate/stable/core/reference/en/html/querysql.html (его Hibernate, а не NHibernate, но он все еще должен применяться), в частности, раздел 16.1.5

...