Je construis un site Web au-dessus de nhibernate. Existe-t-il un moyen efficace de générer des rapports? BY rapports, je veux dire est-il de toute façon d'exécuter une requête compliquée qui saisit des morceaux de données aléatoires? Procédures stockées? Hql? Puis-je obtenir des valeurs uniques non mappées à partir de hql?NHibernate et rapports
Répondre
Oui, vous pouvez. Pour des choses simples, vous pouvez utiliser HQL et sélectionner des choses dans un nouvel objet non mappé (sa classe doit être "enregistrée" avec NH mais il n'y a pas de mappage en soi). La syntaxe HQL ressemble à sélectionnez new NonMappedClass (column1, column2). Vous avez besoin d'un constructeur approprié pour l'utiliser.
La création de rapports avec HQL se décompose rapidement. Je me retrouve souvent à savoir exactement ce qu'il faut faire en SQL, mais j'ai du mal à trouver la méthode HQL. Aussi le manque de vrais outils logiciels pour HQL vous ralentit (désolé NH Query Analyzer ne le coupe pas). Dans ce cas, vous pouvez définir un brut avec un associé. Lors de l'exécution de ces requêtes, NH vous renverra un IList du tableau d'Object. Vous avez besoin de lancer l'Object() dans le bon type. Vous en aurez besoin pour les requêtes de rapports avancées.
Cette coulée est sujette aux erreurs et suce beaucoup. Alors vous avez fait un bon transformateur de requête AliasToBean qui peut mapper le nom de la colonne de l'ensemble de résultats à une propriété (les noms doivent bien sûr correspondre). Je ne connais pas la dernière version de NH, mais l'ancien convertisseur AliasToBean 1.2.1 semblait avoir un bug dans lequel il convertissait le type de valeur NULL à la valeur par défaut du type au lieu de le mettre à null. c'est-à-dire: int? serait 0 au lieu de null si le champ DB associé était null. Cela m'a empêché d'utiliser AliasToBean dans certains cas et j'ai dû cartographier à la main.
Le meilleur conseil est de ne pas tomber dans le piège de la création de rapports complexes avec votre objet métier et pour les boucles. J'ai vu ça en production. Ce sera une horreur de performance à mesure que vos tables grossissent.
Désolé S.O. a mutilé mon texte. Je voulais dire: Dans ce cas, vous pouvez définir une requête sql brute avec un jeu de résultats associé. –
Oui, vous pouvez le faire. C'est ce qu'on appelle l'instanciation dynamique. La syntaxe est HQL
select new MyClass(cust.age)
from customers cust
Ou, avec des critères:
.SetProjection(Projections.ProjectionList()
.Add(Projections.Name("cust.age"), "age")
.SetResultTransformer(Transformers.AliasToBean<MyClass>())
Rappelez-vous, vous devez avoir un constructeur correspondant sur MyClass!
Est-il même possible d'extraire des valeurs calculées non mappées au hasard à partir d'une requête hql? –