2 votes

Nhibernate/Hibernate, tables de consultation et conception d'objets

J'ai deux tables. Facture avec les colonnes CustomerID, InvoiceDate, Value, InvoiceTypeID (CustomerID et InvoiceDate forment une clé composite) et InvoiceType avec les colonnes InvoiceTypeID et InvoiceTypeName.

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 sélectives exécutées pour récupérer les données, je préférerais en avoir une seule. J'aimerais également éviter d'utiliser un objet enfant pour de simples listes de consultation. 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 la suivante : comment créer la cartographie pour cela ?

J'ai essayé d'utiliser la fonction de jointure, mais j'ai essayé de joindre en utilisant CustomerID et InvoiceDate, est-ce que j'ai manqué quelque chose d'évident ?

Merci

1voto

Si votre objectif est (comme vous l'avez dit) d'éviter deux requêtes, vous pouvez récupérer les données en utilisant une seule instruction HQL :

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

...comme documenté dans l'hibernate docs . Cela devrait permettre d'exécuter une seule instruction SQL select et de tout récupérer sans aucune modification du mappage.

Il s'agit d'une requête HQL normale et elle est exécutée comme suit :

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

De plus amples informations sont disponibles sur le langage de requête hibernate page .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X