2010-07-07 5 views
3

Все,Hibernate Критерии - Возврат родительские записи, имеющие дочерние записи

Я, вероятно, более-анализа этой проблемы, но ...

Учитывая таблица «А» с два один-ко-многим «A1» и «A2», верните все записи в таблице «A», которые имеют хотя бы одну дочернюю запись в любой таблице «A1» или «A2» ...

Мне не обязательно интересно знать что данные ребенка, а скорее, что у меня есть только дочерние данные.

Спасибо!

ответ

6

Вам нужен Restrictions.isNotEmpty() критерий:

List<A> r = s.createCriteria(A.class) 
    .add(Restrictions.or(
     Restrictions.isNotEmpty("a1"), 
     Restrictions.isNotEmpty("a2"))).list(); 
+0

Это было легко ... просто хорошо ... спасибо! –

+0

Вау, я не знал этого. Вероятно, он недоступен в NHibernate. –

0

Вам нужно подзапрос, используя DetachedCriteria:

Существует example in Ayende's Blog. В настоящее время у меня нет времени для его разработки.

-1

Я думаю, что этот пример поможет вам. Это написано в t-sql, но должно быть легко следовать любой платформе, которую вы используете.

/*Create data structures*/ 
CREATE TABLE Parent ( 
    ParentId  INT   NOT NULL PRIMARY KEY 
    , ParentName VARCHAR(50) NOT NULL) 

CREATE TABLE ChildA ( 
    ChildAId  INT   NOT NULL PRIMARY KEY 
    , ParentId INT   NOT NULL CONSTRAINT FK_ChildA_Parent FOREIGN KEY REFERENCES Parent(ParentId) 
    , ChildAName VARCHAR(50) NOT NULL) 

CREATE TABLE ChildB ( 
    ChildBId  INT   NOT NULL PRIMARY KEY 
    , ParentId INT   NOT NULL CONSTRAINT FK_ChildB_Parent FOREIGN KEY REFERENCES Parent(ParentId) 
    , ChildBName VARCHAR(50) NOT NULL) 

/* Insert four parents */ 
INSERT INTO Parent VALUES (1,'A') 
INSERT INTO Parent VALUES (2,'B') 
INSERT INTO Parent VALUES (3,'C') 
INSERT INTO Parent VALUES (4,'D') 

/* Insert two children for A */ 
INSERT INTO ChildA VALUES (1,1,'a') 
INSERT INTO ChildB VALUES (1,1,'a') 

/* Insert one child for B */ 
INSERT INTO ChildA VALUES (2,2,'b') 

/* Insert one child for C */ 
INSERT INTO ChildB VALUES (2,3,'c') 

/* This select stmt returns A with children in both child tables, B with a child in ChildA, and C with a child in ChildB, but no D. */ 
SELECT * 
FROM Parent p 
WHERE EXISTS (select 1 from ChildA a where p.ParentId = a.ParentId) 
OR  EXISTS (select 1 from ChildB b where p.ParentId = b.ParentId) 
Смежные вопросы