2009-03-18 2 views
8

У меня есть класс, который сопоставляется с таблицей с использованием NHibernate. Проблема в том, что только некоторые из свойств отображаются в столбцы таблицы. Это прекрасно, потому что отображаются только столбцы, которые мы используем для отображения, однако мне было интересно, есть ли способ запросить другие столбцы в таблице, которые не отображаются в свойствах моего класса.Query Unmapped Columns в NHibernate

Например, мы имеем таблицу со следующими столбцами:

Customer 
----------- 
CustomerId 
Name 
DateCreated 

и у нас есть объект

public class Customer 
{ 
    public virtual int CustomerId {get;set;} 
    public virtual string name {get;set;} 
} 

и name и customerId отображаются однако DateCreated не потому, что мы никогда не отображать его в любом месте , Мы хотели бы запросить таблицу Customer для клиентов, которые были созданы на определенную дату. Есть ли способ сделать это без картирование DateCreated? Также было бы предпочтительнее сделать это, используя критерии API.

ответ

11

Ayende Rahien опубликовал статью, в которой описывается определение access="noop" в сопоставлении, чтобы указать свойства только для запроса. См. NHibernate – query only properties. Я сам этого не пробовал.

+0

Это работает очень красиво и очень легко настроить. – Goblin

+0

Я не мог получить это для работы с элементом свойства - есть ли у него трюк? –

+1

@DaleBurrell Я просто протестировал это, но не работал. Согласно документу 'noop' ​​недействителен для атрибута' access' элемента 'property' (см. [ссылка] (http://nhforge.org/doc/nh/en/#mapping-declaration-property)). –

5

Использование простого SQL-запроса не может быть и речи? Я не могу проверить его прямо сейчас, но я бы предположил, что вы можете запрашивать по немаркированным полям, если ваш запрос возвращает то, что Hibernate может сопоставить с объектом. (Извините, если это уже было исключено в качестве опции)

EDIT: Это похоже на работу:

ISQLQuery query = session.CreateSQLQuery(
       "select c.* " + 
       "from Customer c " + 
       "where c.CreateDate > :CreateDate"); 

query.SetDateTime("CreateDate", new DateTime(2009, 3, 14)); 
query.AddEntity(typeof(Customer)); 

IList<Customer> results = query.List<Customer>(); 
+0

(имена моих колонок были немного разными) –

+0

Этого не может быть и речи, но я бы очень хотел, чтобы можно было использовать критерии api, если это вообще возможно. Спасибо за сообщение – lomaxx

5

С HQL/Критерии запросов, NHibernate может работать только с тем, что были нанесены на карту (хотя сырье SQL является еще один вариант, как указал Энди Уайт). Если вы хотите использовать запросы Criteria, вам нужно сопоставить столбец.

Однако NHibernate не ограничивается использованием общедоступных членов. Итак, если вы хотите скрывать поле CreateDate, объявите частное (возможно только для чтения?) Свойство. Кроме того, вы можете пропустить свойство и указать NHibernate использовать доступ на уровне поля, установив access="field" на элемент свойства в сопоставлении.

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

+0

Я пробовал использовать частную собственность, но вы не можете иметь частную виртуальную собственность в C#, а nhibernate требуется виртуальная собственность :( –

Смежные вопросы