【问题标题】:using hql in NHibernate在 NHibernate 中使用 hql
【发布时间】:2009-04-27 08:06:52
【问题描述】:

我有两张桌子:

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

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

我在 C# 中使用 NHibernate,并创建了两个类:BtdbnBenhandt

我想得到一个Ilist,如下面的sql:

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

【问题讨论】:

  • 嘿 - 格式化真的很有帮助......

标签: nhibernate hql


【解决方案1】:

HQL 适用于类,而不适用于表。 因此,您必须编写一个 HQL 查询,在其中查询映射到这两个表的类。 如果您想通过 hql 查询返回无法由您的类之一(由 NHibernate 映射的实体类)表示的数据,那么您必须创建一个 DTO 类。 此类具有将包含查询检索到的值的属性。为此,您必须“导入”该类。

然后,你可以这样做:

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

【讨论】:

  • 如果我不想创建 DTD alss 有什么办法
  • 感谢 Frederik Gheysels 但我不想创建 MyDTO 类,有什么办法
  • 您将需要某种“容器”类来保存从数据库返回的结果。不用dto也可以试试,不知道行不行。
  • 弗雷德里克是正确的。 HQL 是一种面向对象的查询语言,因此您必须为其提供对象(在本例中为 DTO 类)。您唯一的其他选择是使用 session.CreateSQLQuery 的原始 SQL 查询。
  • 嗨 Frederik Gheysels 我创建了一个名为 rptBaocaotuvong 的类来包含查询检索到的值,如下所示: IQuery l = session.CreateQuery("select new rptBaocaotuvong(bn.Mabn, bn.Hoten, bn.Ngaysinh, ba.Mavaovien) 来自 Btdbn bn, Benhandt ba 其中 ba.Mabn=bn.Mabn"); IList lt = l.List();这是一个例外:找不到类:rptBaocaotuvong [select new rptBaocaotuvong(bn.Mabn, bn.Hoten, bn.Ngaysinh, ba.Mavaovien) from Baocaotuvong.Btdbn bn, Baocaotuvong.Benhandt ba where ba.Mabn=bn.Mabn]请帮忙!
【解决方案2】:

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

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

如果你想使用 DTO,你必须告诉 NH 在哪里可以找到 DTO 类。只需将导入元素添加到您的映射:

<import class="ConsoleApplication2.PublisherDto" />

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      相关资源
      最近更新 更多