используя hql в NHibernate - PullRequest
2 голосов
/ 27 апреля 2009

У меня есть две таблицы:

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

Я использовал NHibernate с C # и создал два класса: Btdbn и Benhandt

Я хочу получить Ilist как sql ниже:

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

Ответы [ 3 ]

1 голос
/ 27 апреля 2009

HQL работает с классами, а не с таблицами. Итак, вы должны написать HQL-запрос, в котором вы запрашиваете классы, которые сопоставлены с этими двумя таблицами. Если вы хотите возвратить данные с помощью hql-запроса, который не может быть представлен одним из ваших классов (классов сущностей, которые отображаются NHibernate), то вам придется создать класс DTO. Этот класс имеет свойства, которые будут содержать значения, полученные запросом. Чтобы сделать это, вам нужно «импортировать» этот класс.

Затем вы можете сделать что-то вроде этого:

select new MyDTO(tdbn.mabn, badt.mava) from btdn tdbn inner join tdbn.mabn
0 голосов
/ 25 января 2012

HQL поддерживает проекцию запросов, поэтому вы можете написать запрос без использования DTO:

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

Если вы хотите использовать DTO, вы должны указать NH, где найти класс DTO. Просто добавьте элемент импорта в ваше отображение:

<import class="ConsoleApplication2.PublisherDto" />
0 голосов
/ 25 января 2012

Имя Медисофт привлекло мое внимание. У меня нет опыта работы с HCL, но я подумал, что стоит упомянуть сайт разработчиков Advantage Database .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...