Nhibernate由ICriteria收集

时间:2010-03-22 08:02:51

标签: nhibernate collections

的同事。我在获取我的实体方面遇到了问题。映射:

     <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
           assembly="Clients.Core"
           namespace="Clients.Core.Domains">
     <class name="Sales, Clients.Core" table='sales'>
        <id name="Id" unsaved-value="0">
          <column name="id" not-null="true"/>
          <generator class="native"/>
        </id>
        <property name="Guid">
           <column name="guid"/>
         </property>
        <set name="Accounts" table="sales_users" lazy="false">
            <key column="sales_id" />
            <element column="user_id" type="Int32" />
        </set>
     </class>

域:

   public class Sales : BaseDomain
   {
        ICollection<int> accounts = new List<int>();
        public virtual ICollection<int> Accounts
        {
            get { return accounts; }
            set { accounts = value; }
   }
    public Sales() { }           
   }

我想获得诸如

之类的查询
SELECT * 
 FROM sales s 
 INNER JOIN sales_users su on su.sales_id=s.id 
 WHERE su.user_id=:N

我如何通过ICriterion对象执行此操作?

非常感谢。

2 个答案:

答案 0 :(得分:2)

这就是我认为答案应该是:

public IEnumerable<Sales> GetSalesForUser(int userId)
{
    return session.CreateCriteria<Sales>()
        .CreateAlias("Accounts", "accounts")
        .Add(Restrictions.Eq("accounts.UserId", "userId"))
        .List<Sales>();
}

但我对你的模特感到困惑。看来,Accounts与Sales之间存在多对多的关系,但您没有以这种方式进行映射。我不知道如何过滤int集合(在这种情况下是HashSet)。你可以尝试:

public IEnumerable<Sales> GetSalesForUser(int userId)
{
    return session.CreateCriteria<Sales>()
        .Add(Restrictions.Eq("Accounts", userId))
        .List<Sales>();
}

答案 1 :(得分:1)

var sales = session.CreateCriteria(typeof(Sales))
                     .SetFetchMode("Accounts", FetchMode.Join)
                     .SetResultTransformer(Transformers.DistinctRootEntity)
                     .List<Sales>();