属性不在的Hibernate标准(子查询)

时间:2012-09-28 07:20:33

标签: hibernate subquery hibernate-criteria

我想执行类似

的查询
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标准实现?

由于

2 个答案:

答案 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)));