【问题标题】:NHibernate select specific columnNHibernate 选择特定列
【发布时间】:2018-11-03 03:42:40
【问题描述】:
public class Company_Product
{
    public virtual Int32 Id { get; set; }
    public virtual DateTime SalesDate { get; set; }
    public virtual Company Company{ get; set; }
    public virtual Product Product { get; set; }
}

public class Company
{
    public virtual Int32 Id { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<Company_Product> company_product { get; set; }
}

public class Product
{
    public virtual Int32 Id { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<Company_Product> company_product { get; set; }
}

公司.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="BusinessObjectApp"
                   namespace="BusinessObjectApp.Modal">

    <!-- more mapping info here -->
    <class name="Company" table="[Company]">
        <id name="Id" column="Id">
            <generator class="native" />
        </id>
        <property name="Name" column="Name" />

        <bag name="company_product" table="[Company_Product]" inverse="true" lazy="true">
            <key column="CompanyID" />
            <one-to-many class="Company_Product" />
        </bag>
    </class>
</hibernate-mapping>

Company_Product.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="BusinessObjectApp"
                   namespace="BusinessObjectApp.Modal">

    <!-- more mapping info here -->
    <class name="Company_Product" table="[Company_Product]">
        <id name="Id" column="Id">
            <generator class="native" />
        </id>
        <property name="SalesDate" column="SalesDate" />

        <!-- Many to many -->
        <many-to-one class="Company" name="Company" column="CompanyID" />
        <many-to-one class="Product" name="Product" column="ProductID" />
    </class>
</hibernate-mapping>

Product.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="BusinessObjectApp"
                   namespace="BusinessObjectApp.Modal">

  <!-- more mapping info here -->
  <class name="Product" table="[Product]">
      <id name="Id" column="Id">
          <generator class="native" />
      </id>
      <property name="Name" column="Name" />
      <bag name="company_product" table="[Company_Product]" inverse="true" lazy="true">
          <key column="ProductID" />
          <one-to-many class="Company_Product" />
      </bag>
    </class>
</hibernate-mapping>

如果使用以下代码,我可以检索所有项目:

IList<Company_Product> test = session.QueryOver<Company_Product>()
.List<Company_Product>();

但是下面的代码会产生错误。我知道那是因为 Company_Product 类没有属性。我想将它们映射到相应的对象,如上面的输出。有可能吗?

string query = "SELECT C.Name, P.Name, CP.SalesDate FROM [Company_Product] CP " +
"LEFT JOIN [Company] C ON CP.CompanyID = C.Id " +
"LEFT JOIN [Product] P ON CP.ProductID = P.Id";

var test = session.CreateSQLQuery(query)
.SetResultTransformer(Transformers.AliasToBean<Company_Product>())
.List<Company_Product>();

更新:

现在我可以检索整个对象了。

Company_Product company_product = null;
Company company = null;
Product product = null;
IList<Company_Product> test = session.QueryOver<Company_Product>()
                    .Left.JoinAlias(cp => cp.Company, () => company)
                    .Left.JoinAlias(cp => cp.Product, () => product)
                    .SelectList(list => list
                        .Select(cp => cp.Company).WithAlias(() => company_product.Company)
                        .Select(cp => cp.Product).WithAlias(() => company_product.Product)
                        .Select(cp => cp.SalesDate).WithAlias(() => company_product.SalesDate)
                    )
                    .TransformUsing(Transformers.AliasToBean<Company_Product>())
                    .List<Company_Product>();

但我无法设置嵌套属性。

Company_Product company_product = null;
Company company = null;
Product product = null;
IList<Company_Product> test = session.QueryOver<Company_Product>()
                    .Left.JoinAlias(cp => cp.Company, () => company)
                    .Left.JoinAlias(cp => cp.Product, () => product)
                    .SelectList(list => list
                        .Select(cp => cp.Company.Name).WithAlias(() => company_product.Company.Name)
                        .Select(cp => cp.Product.Name).WithAlias(() => company_product.Product.Name)
                        .Select(cp => cp.SalesDate).WithAlias(() => company_product.SalesDate)
                    )
                    .TransformUsing(Transformers.AliasToBean<Company_Product>())
                    .List<Company_Product>();

谁能帮帮我?我是 Nhibernate 的新手,很抱歉我的英语不好。

【问题讨论】:

标签: nhibernate mapping


【解决方案1】:

您不需要使用本机 SQL 查询来实现此目的。 您可以使用 QueryOver,但必须使用投影。

session.QueryOver<Company_Product>()
       .JoinQueryOver<Company>(cp => cp.Company, ()=>companyAlias)
       .JoinQueryOver<Product>(cp => cp.Product, ()=>productAlias)
       .SelectList( l => l.Select( cp => companyAlias.Name)
                          .Select( cp => productAlias.Name)
                          .Select( cp => cp.SalesDate));

我还没有测试过它,自从我使用 NHibernate 以来已经一年多了,但它应该会为您指明正确的方向。 :)

另外,你为什么用包?我认为一套可能更合适。

【讨论】:

  • 感谢您的回复。我现在能够映射到对象。如果我想像我在更新中提到的那样设置属性怎么办。
  • 我不明白您更新中的问题;我也发现您在更新中发布的 2 个代码示例之间没有区别
  • 我将 cp.Company 更改为 cp.Company.Name 并将 cp.Product 更改为 cp.Product.Name。但是返回一个错误,说找不到属性“名称”的设置器。
  • 你需要使用你定义的别名;请参阅我的答案中的代码示例。因此,您必须使用 company.Name,而不是指定 cp.Company.Name,因为您已将 company 定义为它的别名。
  • 感谢您的建议,我将其更改为 company.Name 仍然有相同的错误(在类 'BusinessObjectApp.Modal.Company_Product' 中找不到属性 'Name' 的设置器)。我认为是没有属性“名称”的 Company_Product,所以我无法设置它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 2014-01-04
  • 2011-02-27
  • 2018-03-17
相关资源
最近更新 更多