2009-01-23 10 views
1

J'ai une relation un-à-plusieurs. Je voudrais construire cette requête:Comment construire cette requête NHibernate

Donnez-moi tous les parents qui ont un seul enfant et cet enfant child.Type = X

Depuis que j'apprends, s'il vous plaît me montrer la requête avec l'API Critères et avec HQL. Merci. Et btw, existe-t-il un moyen automatique de savoir quel HQL est identique à une expression de critère?

Mise à jour:

Il semble que je trouve comment le faire dans HQL:

@"select Parent 
    from Parent parent 
     join parent.Children ch 
     where (ch.Type = :chType) and 
       (select count(*) from parent.Children) = 1") 

Mais est-il bien fait? Comment est la performance? J'ai l'intuition que le compte (*) n'est pas bien placé ...

+0

Je pense que vous obtiendrez une meilleure réponse si vous postez votre fichier de mappage, classe de code, et quelques exemples de données. –

Répondre

1

D'accord avec @David Pellerin sur l'ambiguïté de la question. Cependant, j'étais littéralement juste en train de préparer un Lunch'n'Learn à propos de ce sujet, donc en utilisant la relation typique Customer, Orders. . .

API Critères:

public IList<Customer> GetCustomersWithOrdersAfterDate(DateTime sinceDate) 
{ 
    return Session.ICriteria.CreateCriteria(typeof(Customer)) 
     .CreateCriteria("Orders") 
     .Add(Expression.Gt("OrderDate", sinceDate)) 
     .List<Customer>(); 
} 

HQL (qui ressemble une tonne comme SQL, que vous n'avez pas connaître l'ensemble graphique de la relation):

public IList<Customer> GetCustomersWithOrdersAfterDate(DateTime sinceDate) 
{ 
    Session.CreateQuery("select c from Customer c, c.Orders.elements o WHERE o.OrderDate > :orderDate).SetDateTime("orderDate", sinceDate).List<Customer>(); 
} 

BTW:
si vous sont juste en train d'apprendre, arrêtez tout ce que vous faites et allez regarder these screencasts. Probablement la meilleure série de vidéos que j'ai vues concernant nHibernate. Fortement, hautement recommandé.

Un autre lien utile pour répondre à votre exigence «ayant compte = 1» est here. Assez compliqué, mais j'ai adapté quelque chose de similaire avec un certain succès.

+0

Merci. Ma question était théorique, c'est pourquoi je n'ai pas d'exemple. Je connais la base des critères api comme vous le montrez, mais vous ne me dites pas la chose principale que je demandais: dans votre exemple, je veux obtenir les clients qui n'ont qu'une seule commande. –