我想执行类似
的查询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.
如何使用hibernate标准实现?
由于
答案 0 :(得分:12)
您可以使用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()));
Disclamer:我是a)不是java程序员而且b)可能犯了错误,所以它可能无法编译。代码更粗略地展示了这个想法,无论如何都希望有用。
答案 1 :(得分: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)));