Запрос несопоставленных столбцов в NHibernate - PullRequest
8 голосов
/ 18 марта 2009

У меня есть класс, который сопоставлен с таблицей с помощью 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 критериев.

Ответы [ 3 ]

11 голосов
/ 11 июля 2009

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

5 голосов
/ 18 марта 2009

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

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

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

5 голосов
/ 18 марта 2009

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

РЕДАКТИРОВАТЬ: Это похоже на работу:

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>();
...