2010-03-22 8 views
1

collègues. J'ai un problème pour obtenir mon entité. Cartographie:Nhibernate obtenir la collection par ICriteria

 <?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> 

Domaine:

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

Je veux obtenir requête tels que

SELECT * 
FROM sales s 
INNER JOIN sales_users su on su.sales_id=s.id 
WHERE su.user_id=:N 

Comment puis-je faire cela par objet ICriterion?

Merci beaucoup.

Répondre

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

Merci beaucoup. Et qu'en est-il de "WHERE su.user_id =: N" –

2

C'est ce que je pense que la réponse devrait être:

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

Mais je suis confus par votre modèle. Il semble que Accounts ait une relation many-to-many avec Sales, mais vous ne l'avez pas mappée de cette façon. Je ne sais pas comment filtrer une collection int (HashSet dans ce cas). Vous pouvez essayer:

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

Merci beaucoup. Tu as raison. Une vente pourrait en avoir plusieurs. J'essaie cette variante bu a "NHibernate.QueryException: incompatibilité de type dans NHibernate.Criterion.SimpleExpression: Comptes type attendu Iesi.Collections.Generic.ISet'1 [System.Int32], type réel System.Int32" –

+0

Il devrait y avoir un moyen pour filtrer le HashSet en utilisant l'API Criteria si vous voulez coller avec votre design original. Mais à long terme, il vaudra mieux améliorer votre modèle de domaine. –

Questions connexes