2009-04-27 8 views
2

J'ai deux tables:utilisant hql dans NHibernate

-- Table: medibv.btdbn 

-- DROP TABLE medibv.btdbn; 

CREATE TABLE medibv.btdbn 
(
    mabn varchar(8) NOT NULL, 
    hoten text, 
    ngaysinh timestamp, 
    namsinh varchar(4), 
    phai numeric(1) DEFAULT 0, 
    mann varchar(2), 
    madantoc varchar(2), 
    sonha varchar(15), 
    thon text, 
    cholam text, 
    matt varchar(3), 
    maqu varchar(5), 
    maphuongxa varchar(7), 
    userid numeric(5) DEFAULT 0, 
    ngayud timestamp DEFAULT now(), 
    hotenkdau text, 
    nam text, 
    image bytea, 
    barcode bytea, 
    CONSTRAINT pk_btdbn PRIMARY KEY (mabn) USING INDEX TABLESPACE medi_index, 
    CONSTRAINT fk_btdbn_btddt FOREIGN KEY (madantoc) 
     REFERENCES medibv.btddt (madantoc) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE SET NULL, 
    CONSTRAINT fk_btdbn_btdnn_bv FOREIGN KEY (mann) 
     REFERENCES medibv.btdnn_bv (mann) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE SET NULL, 
    CONSTRAINT fk_btdbn_btdpxa FOREIGN KEY (maphuongxa) 
     REFERENCES medibv.btdpxa (maphuongxa) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE SET NULL, 
    CONSTRAINT fk_btdbn_btdquan FOREIGN KEY (maqu) 
     REFERENCES medibv.btdquan (maqu) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE SET NULL, 
    CONSTRAINT fk_btdbn_btdtt FOREIGN KEY (matt) 
     REFERENCES medibv.btdtt (matt) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE SET NULL 
) 
WITH OIDS; 
ALTER TABLE medibv.btdbn OWNER TO medisoft; 

et

-- Table: medibv.benhandt 

-- DROP TABLE medibv.benhandt; 

CREATE TABLE medibv.benhandt 
(
    mabn varchar(8), 
    mavaovien numeric(18) DEFAULT 0, 
    maql numeric(18) NOT NULL DEFAULT 0, 
    makp varchar(2), 
    ngay timestamp, 
    dentu numeric(1) DEFAULT 0, 
    nhantu numeric(1) DEFAULT 0, 
    lanthu numeric(3) DEFAULT 0, 
    madoituong numeric(2) DEFAULT 0, 
    chandoan text, 
    maicd varchar(9), 
    mabs varchar(4), 
    sovaovien varchar(10), 
    loaiba numeric(3) DEFAULT 0, 
    userid numeric(5) DEFAULT 0, 
    ngayud timestamp DEFAULT now(), 
    cschandoan text, 
    CONSTRAINT pk_benahndt PRIMARY KEY (maql), 
    CONSTRAINT fk_benhandt_btdkp_bv FOREIGN KEY (makp) 
     REFERENCES medibv.btdkp_bv (makp) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE SET NULL, 
    CONSTRAINT fk_benhandt_doituong FOREIGN KEY (madoituong) 
     REFERENCES medibv.doituong (madoituong) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE SET NULL 
) 
WITH OIDS; 
ALTER TABLE medibv.benhandt OWNER TO medisoft; 

je NHibernate avec C# et j'ai créé deux classes: Btdbn et Benhandt

je veux obtenir un Ilist comme sql ci-dessous:

hql= "select tdbn.mabn, badt.mavaovien " + 
    "from btdbn tdbn " + 
    "  inner join benhandt badt on tdbn.mabn = badt.mabn"; 
+0

Hey - formatage serait vraiment aider ... – Rashack

Répondre

1

HQL fonctionne sur les classes, pas sur les tables. Donc, vous devez écrire une requête HQL dans laquelle vous interrogez les classes qui sont mappées à ces 2 tables. Si vous souhaitez renvoyer des données par la requête hql qui ne peut pas être représentée par l'une de vos classes (classes d'entités mappées par NHibernate), vous devrez créer une classe DTO. Cette classe a des propriétés qui contiendront les valeurs récupérées par la requête. Pour pouvoir faire cela, vous devrez 'importer' cette classe.

Ensuite, vous pouvez faire quelque chose comme ceci:

select new MyDTO(tdbn.mabn, badt.mava) from btdn tdbn inner join tdbn.mabn 
+0

est-il possible si je ne veux pas créer DTD ALSs –

+0

je ne pense pas. –

+0

Merci Frederik Gheysels mais je ne veux pas créer de classe MyDTO, est-il possible de –

0

HQL supporte la projection de requête de sorte que vous pouvez écrire votre requête sans utiliser DTO:

var q = session.CreateQuery("select p.Name, p.TaxCode from Publisher p") 
        .List(); 

Si vous souhaitez utiliser DTO vous devez indiquer NH où trouver la classe DTO. Il suffit d'ajouter un élément d'importation à votre cartographie:

<import class="ConsoleApplication2.PublisherDto" />