使用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

但我找不到任何样本或与这个特殊情况有关的东西。

帮忙吗?

使用NHibernate和Native SQL从表中选择几列

非常简单:

  1. do NOT use AddEntity(typeof(MyEntity)
  2. 使用变压器 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(我们可以使用更复杂的投影)