在NHibernate中使用hql

在NHibernate中使用hql,nhibernate,hql,Nhibernate,Hql,我有两张桌子: -- 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), so

我有两张桌子:

-- 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;

我将NHibernate与C一起使用,并创建了两个类:Btdbn和Benhandt

我想在下面获得类似于sql的Ilist:

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

HQL在类上工作,而不是在表上。 因此,必须编写一个HQL查询,在其中查询映射到这两个表的类。 如果希望通过hql查询返回不能由NHibernate映射的某个类实体类表示的数据,则必须创建DTO类。 此类的属性将包含查询检索到的值。要做到这一点,您必须“导入”该类

然后,您可以这样做:

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

Medisoft这个名字引起了我的注意。我没有使用HCL的经验,但我想我会提到检查。

HQL支持查询投影,因此您可以在不使用DTO的情况下编写查询:

var q = session.CreateQuery("select p.Name, p.TaxCode from Publisher p")
                    .List();
若你们想使用DTO,你们必须告诉NH在哪里可以找到DTO类。只需将导入元素添加到映射:

<import class="ConsoleApplication2.PublisherDto" />

嘿-格式化真的很有帮助…如果我不想创建DTD alssthank Frederik Gheysels,但我不想创建MyDTO类,有没有办法你需要某种“容器”类来保存从DB返回的结果。你可以不用dto试试,但我不知道它是否有效。弗雷德里克是对的。HQL是一种面向对象的查询语言,因此在本例中,必须为其提供DTO类对象。您唯一的其他选项是session.CreateSQLQuery.hi Frederik Gheysels的原始SQL查询。我创建了一个名为rptBaocaotuvong的类,以包含该查询检索到的值,如下所示:IQuery l=session.CreateQueryselect new rptBaocaotuvongbn.Mabn,bn.Hoten,bn.Ngaysinh,ba.mavaovein from Btdbn bn,Benhandt ba where ba.Mabn=bn;IList lt=l.列表;异常:未找到类:rptbaotuvong[从Baocaotuvong.Btdbn bn,Baocaotuvong.Benhandt ba where ba.Mabn=bn.Mabn中选择新的rptbaotuvongbn.Mabn.Hoten,bn.Ngaysinh,ba.Mavaovien]请帮助!
<import class="ConsoleApplication2.PublisherDto" />