4

我想执行类似的查询

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.

如何使用休眠标准实现?

谢谢

4

2 回答 2

13

您可以使用 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()));

免责声明:我 a) 不是 java 程序员,b) 可能犯了错误,所以它可能无法编译。该代码更多地粗略地展示了这个想法,并且希望无论如何都会有所帮助。

于 2012-09-28T09:23:42.123 回答
4

创建全选条件:

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)));
于 2012-09-28T09:20:39.530 回答