2010-06-03 7 views
1

Je suis nouveau sur NHibernate et je n'arrive pas à comprendre pourquoi ces deux instructions génèrent des sql différents.NHibernate CreateCriteria et CreateQuery génèrent des sql différents?

le premier n'obtient que le ClientInformation (avec information et client étant proxies) qui est ce que je veux.

return repository 
      .CreateQuery("from ClientInformation ci where ci.Information.IsMandatory = true and ci.Client.Id = :clientId") 
      .SetParameter("clientId", clientId) 
      .List<ClientInformation>(); 

La seconde génère tout. Toutes les données sont renvoyées pour les 3 entités, ce qui est pas ce que je veux

return repository.CreateCriteria() 
      .CreateAlias("Information", "inf") 
      .CreateAlias("Client", "cli") 
      .Add(Expression.Eq("cli.Id", clientId)) 
      .Add(Expression.Eq("inf.IsMandatory", true)) 
      .List<ClientInformation>(); 

Ce que je suis-je tort? merci

Répondre

1

En fait, tout se résume à ce que vous voulez faire. d'abord toutes les requêtes Critères honorer les définitions de mappage (jointures paresseux/désireux etc) où dans les requêtes constrast HQL sauf indication contraire tout est paresseux (hors propriétés de valeur bien sûr)

En second lieu la méthode createAlias ​​définit les entités à se joindre et le comportement par défaut est également de les sélectionner.

Notez que vous appelez

repository.CreateCriteria() 

et si qui enveloppe directement nhSession.CreateCriteria() alors vous n'avez pas défini exactement ce que vous voulez sélectionner. Alors, essayez de faire ce

nhSession.CreateCriteria(typeof(ClientInformation)); 

qui sera traduit par « sélectionnez uniquement ClientInformation » ...

+0

correspondances sont définies comme lazyload. et createCriteria renvoie un typeof (ClientInformation) –

Questions connexes