Не удалось найти сеттер для свойства в классе - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь создать критерии следующим образом:

var criteria - session.CreateSQLQuery("select * from myTable where ID in (select id from tableB) AND ANOTHERID IN(select id from tableC)");

criteria.SetResultTransformer(Transformers.AliasToBean(typeof(myClass))).List<MyClass>().ToList()

И получил следующее исключение:

Не удалось найти установщик для свойства 'NAME' в классе 'MYCLASS'

свойство hbm:

<property name="Name" type="string" column="NAME" not-null="true" update="true" insert="true"/>

.cs:

private string name;
public virtual string Name
{
   get {return this.name;}
   set { this.name=value;}
}

Что мне здесь не хватает?

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Версии NHibernate до 5.0 имели ошибку , когда свойства были сопоставлены с учетом регистра.В 5.0+ этот запрос будет работать.

AliasToBeanResultTransformer (Transformer.AliasToBean(...)) предназначен для использования с "проекциями" и поэтому не использует сопоставления для привязки столбцов к классу.

Если вы хотите вернуть сущность и хотите использовать сопоставление, вам нужно вызвать AddEntity(...) в вашем запросе, например:

var query = session.CreateSQLQuery("select * from myTable where ID in (select id from tableB) AND ANOTHERID IN(select id from tableC)");

query.AddEntity(typeof(myClass)).List<MyClass>();
0 голосов
/ 29 мая 2019

Проблема заключается в разнице между именем столбца и именем свойства.Имена членов чувствительны к регистру.

Ваше отображение HBM явно сообщает NHibernate, что столбец "NAME" сопоставлен со свойством "Name".Но при вызове Transformers.AliasToBean имена столбцов должны совпадать с именами свойств.

См. Совет от здесь :

Совет: вызовы addScalar()были необходимы для HSQLDB, чтобы он соответствовал имени свойства, так как он возвращает имена столбцов в верхнем регистре (например, STUDENTNAME).Эту проблему также можно решить с помощью специального преобразователя, который ищет имена свойств вместо точного соответствия - возможно, нам следует предоставить метод fuzzyAliasToBean();)

Вы можете явно указать имя столбца (вместо этогоиз *) как показано ниже:

select ID, Name from myTable where....

Обратите внимание, что для столбца Name сопоставляется имя свойства.

Вы можете создать псевдоним столбца в своем SQL;но выше решение лучше.

Вы можете использовать пользовательский трансформатор.

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