使用NHibernate和Native SQL从表中选择几列
本文关键字:选择 几列 NHibernate Native SQL 使用 | 更新日期: 2023-09-27 18:06:28
我正在使用c#语言开发一个使用NHibernate的web应用程序。然而,我不能建立一个本地MySQL查询只有几个字段,然后映射。
我的hbm.xml看起来像:
<class name="Rule" table="rule">
<id name="Id" column="id" type="int">
<generator class="native"></generator>
</id>
<property name="Name" column="name" type="String" not-null="false"></property>
<property name="Description" column="description" type="String" not-null="false"></property>
<property name="Shops" column="shops" type="String" not-null="false"></property>
<property name="Channels" column="channels" type="String" not-null="false"></property>
<property name="Currency" column="currency" type="int" not-null="false"></property>
<property name="Range" column="range" type="int" not-null="false"></property>
<property name="Created" column="created" type="DateTime" ></property>
<property name="Modified" column="modified" type="DateTime" ></property>
</class>
我的原生查询看起来像:
var session = this.GetFactory().OpenSession();
var query = session.CreateSQLQuery("SELECT * FROM `rule` WHERE currency = :currency AND `range` = :range");
query.SetParameter("currency", this.SearchRoot.Currency.Id);
query.SetParameter("range", this.SearchRoot.Range.Id);
query.AddEntity(typeof(Rule));
var rules = query.List<Rule>();
当我运行我的应用程序,一切都很好。然而,对于这个特殊的例子,我不需要所有的字段,我只需要id,商店和渠道,所以我做了以下更改:
var session = this.GetFactory().OpenSession();
var query = session.CreateSQLQuery("SELECT id, shops, channels FROM `rule` WHERE currency = :currency AND `range` = :range");
query.SetParameter("currency", this.SearchRoot.Currency.Id);
query.SetParameter("range", this.SearchRoot.Range.Id);
query.AddEntity(typeof(Rule));
var rules = query.List<Rule>();
然后我得到以下错误:
Exception Details: System. s。IndexOutOfRangeException: result: name
我理解NHibernate总是尝试匹配类属性与表的字段。我读了本地查询的文档。
nhibernate native query
但我找不到任何样本或与这个特殊情况有关的东西。
帮忙吗?
非常简单:
- do NOT use
AddEntity(typeof(MyEntity)
- 使用变压器
Transformers.AliasToBean<MyEntity>()
但是,现在我们必须修改SQL SELECT语句:
列别名必须匹配属性名
起草的解决方案:
var query = session.CreateSQLQuery("SELECT id as ID, shops as Shop ....");
...
//query.AddEntity(typeof(Rule));
query.SetResultTransformer(Transformers.AliasToBean<Rule>())
总结……如果按照映射中定义的方式提供所有列,则可以直接映射到实体。匹配由列名和 column=""
映射驱动。我们也可以使用投影,只选择几个列…在这种情况下,我们必须提供别名等于 name=""
映射并使用Transformer
。(我们可以使用更复杂的投影)