在课堂上找不到财产的设定者

时间:2019-05-28 11:06:41

标签: nhibernate

我正在尝试创建条件,如下所示:

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

并得到以下异常:

  

在类“ MYCLASS”中找不到属性“ NAME”的设置器

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 :(得分:0)

问题是由于列名和属性名的大小写不同。成员名称区分大小写。

您的HBM映射明确告知NHibernate,列“ NAME”已映射到属性“ Name”。但是,在调用Transformers.AliasToBean时,列名应与属性名匹配。

here参考提示:

  

提示:HSQLDB需要进行addScalar()调用才能使其与属性名称匹配,因为它返回所有大写的列名称(例如STUDENTNAME)。这也可以通过搜索属性名称而不是使用完全匹配的自定义转换器来解决-也许我们应该提供fuzzyAliasToBean()方法;)

您可以像下面这样明确提及列名(而不是*):

select ID, Name from myTable where....

请注意Name列的大小写与属性名称匹配。

您可以在SQL中创建列别名;但以上解决方案更好。

您可以使用自定义转换器。

答案 1 :(得分:0)

5.0之前版本的NHibernate具有a bug,其中属性区分大小写。在5.0以上版本中,此查询将有效。

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