Критерии гибернации со свойством, не входящим в (подзапрос)

Я хочу выполнить запрос вроде

Select id, name from information where name not in (select firstname from contact where id  = 1)

Information
Id Name
1  Test

Contact
id firstname
1  name
2  Test

Если я использую функцию neProperty (), она вернет записи как name != Test.

Как я могу реализовать критерии гибернации?

Спасибо


person Vinit Prajapati    schedule 28.09.2012    source источник


Ответы (2)


Создайте критерии выбора всех:

Criteria cr = session.createCriteria(Your.class); 
List list = cr.list(); 

Затем вы можете добавить к нему ограничение, т.е. где столбец 1 = 8 и т. Д., Например:

cr.add(Restrictions.eq("YourCondition", YourCondition));

Наконец, вы можете указать предложение not in следующим образом:

cr.add(Restrictions.not(Restrictions.in("YourNotInCondition", YourNotInCondition)));
person Atif Imran    schedule 28.09.2012

Вы можете использовать DetachedCriteria для создания подзапроса.

// This corresponds to (select firstname from contact where id  = 1)
DetachedCriteria subquery = DetachedCriteria.forClass(Contact.class)
    .add(Restrictions.eq("id", 1))
    .setProjection(Projections.property("name"))

// This corresponds to (select information where name not in (subquery))
ICriteria criteria = session
    .createCriteria(Information.class)
    .add(Subqueries.notIn("name", subquery));

Вместо использования подзапроса вы можете просто загрузить контакт с помощью session.get с шансом попасть в кеш:

Contact contact = session.Get<Contact>(1);

ICriteria criteria = session
    .createCriteria(Information.class)
    .add(Property.ne("name", contact.getName()));

Отказ от ответственности: я а) не программист на Java и б) мог допустить ошибки, поэтому он, вероятно, не компилируется. Код более грубо демонстрирует идею и, надеюсь, в любом случае будет полезен.

person Stefan Steinegger    schedule 28.09.2012