2010-11-08 5 views
1

Existe-t-il un moyen dans NHibernate de mapper le résultat d'une requête de comptage sur une propriété d'une classe? Je voudrais faire cela dans le mapping XML. Je sais que je pourrais formuler ceci via le code (soit avec une construction qui interroge réellement le compte, ou en trichant, en faisant la requête complète, et en comptant les éléments résultants), mais ce serait bien si je pouvais écrire quelques mots SQL ou HQL et confiture que dans ma cartographie XML, en quelque sorte.NHibernate nombre d'éléments dans le mappage xml

Un exemple concret. Mon DB a ces tables -

Entry 
    Id 
    BodySummary 

Comment 
    Id 
    EntryId 
    Body 

Je veux obtenir un résumé des entrées. Pour chacune des entrées, je veux obtenir le nombre de commentaires (et le résumé du corps). FYI: J'ai omis des parties non pertinentes de ma base de données, comme les auteurs, le titre/corps d'entrée, les horodatages, etc. Cela ne devrait évidemment pas avoir d'incidence sur la partie de la requête que je pose.

Répondre

6

Je ne pense pas que vous pouvez le faire avec HQL. Mais voici comment le faire avec SQL:

<class name="Entry" .... > 
    <id> 
    //ID Strategy 
    </id> 
    <property name="BodySummary" /> 
    ... 
    <property name="CommentCount" formula="(SELECT COUNT(*) FROM Comment c WHERE c.EntryId = Id)" type="Int32" /> 
</class> 

Important à noter:

  1. Enroulez le sql entre parenthèses - il erreur si elle n'est pas enveloppé
  2. Ce n'est pas HQL - vous avez d'utiliser les noms de colonnes de base de données/table pas vos classes mappées/propriétés
  3. Fournir un type de retour si NHibernate sait comment mapper revenir à la propriété

Vous voudrez probablement en faire un champ en lecture seule, mais c'est la base de la façon dont vous le mapperiez.

SQL résultante serait quelque chose comme ceci:

SELECT   this_.Id    as Id11_0_, 
       this_.BodySummary  as BodySummary10_11_0_, 
       (SELECT COUNT(*) 
       FROM Comment c 
       WHERE c.EntryId = this_.Id) as formula0_0_ 
FROM  Entry this_