gpt4 book ai didi

c# - 使用 NHibernate 和 native SQL 从表中仅选择几列

转载 作者:太空宇宙 更新时间:2023-11-03 12:40:03 25 4
gpt4 key购买 nike

我正在使用 C# 语言使用 NHibernate 开发网络应用程序。但是,我无法仅使用少量字段构建原生 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、商店和 channel ,因此我进行了以下更改:

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

然后我得到以下错误:

异常详细信息:System.IndexOutOfRangeException:无法在结果中找到指定的列:名称

我知道 NHibernate 总是尝试将类属性与表的字段相匹配。我阅读了有关 native 查询的文档。

nhibernate native query

但我找不到任何样本或与此特定案例相关的内容。

有什么帮助吗?

最佳答案

这非常简单:

  1. 不要使用AddEntity(typeof(MyEntity)
  2. 使用Transformer Transformers.AliasToBean<MyEntity>()

但是,现在我们必须更改 SQL SELECT 语句:

column aliases must match to Property name

草拟的解决方案:

var query = session.CreateSQLQuery("SELECT id as ID, shops as Shop ....");
...
//query.AddEntity(typeof(Rule));
query.SetResultTransformer(Transformers.AliasToBean<Rule>())

总结...如果我们提供映射中定义的所有列,我们可以直接映射到实体。匹配由列名和 column="" 驱动 映射。我们还可以使用 projectin,只选择几列...在这种情况下,我们必须提供等于 name="" 的别名 映射和使用Transformer . (我们甚至可以使用 more complex projection )

关于c# - 使用 NHibernate 和 native SQL 从表中仅选择几列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39402116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com