NHibernate Inner Присоединиться Получить только некоторые столбцы? - PullRequest
2 голосов
/ 12 октября 2010

Я разрабатываю приложение с использованием nHibernate и MySQL.

У меня есть команда HQL, которая запускается каждую секунду, и в этой команде я делаю «Inner Join Fetch», например:

"из заказа o выборка внутреннего соединения o.Customer заказ по o.Date"

Работает нормально, но заполняет все свойства "Customer", и у меня есть много столбцов в базе данных (почти 40 столбцов). Мне нужно только несколько столбцов, таких как Имя, Адрес и Телефон, чтобы отобразить их на уровне презентации.

Есть ли способ получить только некоторые свойства с помощью Fecth Join или другим способом улучшить производительность?

Спасибо ...

Приветствия

Ответы [ 3 ]

4 голосов
/ 12 октября 2010

Вы можете создать вторичное сопоставление только для чтения, которое извлекает только часть столбцов в Dto (объект передачи данных):

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Your.NameSpace" assembly="Your.Assembly">
  <class name="OrderDto" table="[Order]" schema-action="none" lazy="false" mutable="false">
  <id name="Id">
    <generator class="native"/>
  </id>
  <many-to-one name="CustomerDto" class="CustomerDto"/>
  <!-- Other properties-->
  </class>
</hibernate-mapping>

Таким образом, вы получаете полный контроль над тем, что извлекается изБД.Однако есть и обратная сторона - убедитесь, что она помечена как mutable = "false", иначе вы можете сохранить ее без полных данных.

И если вы действительно хотите сойти с ума - вы делаете OrderDtoреализовать тот же интерфейс, что и в обычном порядке, а затем при запросе свойства, которое еще не загружено, вы получаете полный заказ.Это добавляет немного сложности, но вы получаете чрезвычайную гибкость, а также возможность использовать Dto вместо реального объекта со всеми преимуществами производительности Dto.(Это также называется шаблоном Proxy, тогда как первый бит иногда называется PresentationModel, так как он предназначен для представления без обычной бизнес-логики.)

3 голосов
/ 13 октября 2010

Если вы ищете только некоторые свойства, не используйте join fetch, потому что это не то, для чего оно нужно.

Вместо этого выберите нужные свойства и (необязательно) увлажните DTO с ними.Вам даже не требуется явное объединение:

select o, o.Customer.Name, o.Customer.Address
from Order o
order by o.Date

, которое возвращает кортеж (object[]) для каждой строки, где 1-й элемент - это заказ, 2-й - имя клиента и т. Д.

0 голосов
/ 10 мая 2011

Вы также можете создать представление базы данных только тех столбцов и таблиц, которые вы хотите. Затем привяжите nhibernate к виду.

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