NHibernate — исключение CreateSQLQuery «Нет сохранения для ..», почему?

#hibernate #nhibernate #fluent-nhibernate #nhibernate-mapping

#спящий режим #nhibernate #свободно-nhibernate #nhibernate-отображение

Вопрос:

Я пытаюсь создать SQL-запрос в NHibernate с помощью CreateSQLQuery:

 var query = session.CreateSQLQuery(
    "select loss.id as loss.Id, loss.start_date as loss.Date, "   
    "       (select ... limit 1) as loss.Reserve, "  
    "       (select sum(m.val) ...) as loss.Payment "  
    "from LossData loss .. where ...";

// Commenting or uncommenting these doesn't have any effect either
query.AddScalar("Id", NHibernateUtil.Int32);
query.AddScalar("Date", NHibernateUtil.DateTime);
query.AddScalar("Reserve", NHibernateUtil.Double);
query.AddScalar("Payment", NHibernateUtil.Double);

query.AddEntity("loss", typeof(LossQueryDto));
query.SetResultTransformer(Transformers.AliasToBean(typeof(LossQueryDto)));

var list = query.List<LossQueryDto>();
  

Но это выдает мне ошибку «Нет сохранения для: ‘LossQueryDto'». Что не так с этим запросом?
Нужно ли мне дополнительное сопоставление для запроса? Если да, могу ли я определить его в Fluent Nhibernate ? Я использую NHibernate 3.1.

Сам Dto выглядит так:

 public class LossQueryDto
{
    public virtual int Id { get; set; }
    public virtual DateTime Date { get; set; }
    public virtual double Reserve { get; set; }
    public virtual double Payment { get; set; }
}
  

Спасибо!

Комментарии:

1. Можем ли мы увидеть сопоставления?

2. Какие сопоставления? У меня нет никаких сопоставлений для ‘LossQueryDto’. Насколько я понимаю, сопоставления не требуются при использовании CreateSQLQuery (когда не выполняются именованные запросы). Если мне нужно создать сопоставление, то как мне это сделать и как вызвать запрос?

Ответ №1:

Вы запрашиваете не объекты, а DTO, поэтому вы можете удалить следующее:

 query.AddEntity("loss", typeof(LossQueryDto));
  

Комментарии:

1. Оказывается, мне действительно нужно сопоставление для dto. Поскольку вы единственный ответчик, я принимаю ваш ответ, хотя он не совсем релевантен.