2

J'ai deux tables. Facture avec les colonnes CustomerID, InvoiceDate, Value, InvoiceTypeID (CustomerID et InvoiceDate constituent une clé composite) et InvoiceType avec les colonnes InvoiceTypeID et InvoiceTypeName.Nhibernate/Hibernate, tables de recherche et design d'objets

Je sais que je peux créer mes objets comme:

public class Invoice 
{ 
    public virtual int CustomerID { get; set; } 
    public virtual DateTime InvoiceDate { get; set; } 
    public virtual decimal Value { get; set; } 
    public virtual InvoiceType InvoiceType { get; set; } 
} 

public class InvoiceType 
{ 
    public virtual InvoiceTypeID { get; set; } 
    public virtual InvoiceTypeName { get; set; } 
} 

Ainsi, le SQL généré ressemblerait à quelque chose comme:

SELECT CustomerID, InvoiceDate, Value, InvoiceTypeID FROM Invoice WHERE CustomerID = x AND InvoiceDate = y 
SELECT InvoiceTypeID, InvoiceTypeName FROM InvoiceType WHERE InvoiceTypeID = z 

Mais plutôt que d'avoir deux requêtes SELECT exécutées pour récupérer les données que je voudrais plutôt en avoir un. Je voudrais également éviter d'utiliser l'objet enfant pour les listes de recherche simples. Donc, mon objet ressemblerait à quelque chose comme:

public class Invoice 
{ 
    public virtual int CustomerID { get; set; } 
    public virtual DateTime InvoiceDate { get; set; } 
    public virtual decimal Value { get; set; } 
    public virtual InvoiceTypeID { get; set; } 
    public virtual InvoiceTypeName { get; set; } 
} 

Et mon sql ressemblerait à quelque chose comme:

SELECT CustomerID, InvoiceDate, Value, InvoiceTypeID 
FROM Invoice INNER JOIN InvoiceType ON Invoice.InvoiceTypeID = InvoiceType.InvoiceTypeID 
WHERE CustomerID = x AND InvoiceDate = y 

Ma question est de savoir comment puis-je créer le mappage pour cela?

J'ai essayé d'utiliser join, mais j'ai essayé de joindre avec CustomerID et InvoiceDate, est-ce que quelque chose me manque?

Merci

Répondre

1

Si votre objectif est (comme vous le dites) pour éviter deux requêtes, vous pouvez récupérer les données à l'aide d'une seule instruction HQL:

select i, it from Invoice i fetch join i.type it where ... 

... comme indiqué dans la mise en veille prolongée docs . Cela devrait exécuter une seule instruction SQL select et récupérer tout sans aucune modification de mappage.

C'est une requête régulière HQL et est exécuté comme suit:

IQuery q = s.CreateQuery("select i, it from Invoice i fetch join i.type it where ..."); 
IList invoices = q.List(); 

Plus d'informations sont disponibles sur la langue de la requête en veille prolongée page.

+0

Merci pour la réponse, mais comment faites-vous réellement cela? Où spécifiez-vous cette HQL? Dans la cartographie? Dans le code? Je ne comprends toujours pas comment ajouter la table de recherche dans le mappage. Merci. – lancscoder

+0

J'ai mis à jour ma réponse avec du code supplémentaire pour mieux l'expliquer. Lorsque vous avez besoin de données de facturation, vous exécutez une telle requête dans votre code OO, oui. –