如何使用条件,分离的条件和子查询来检索对象

时间:2011-07-22 20:28:50

标签: java hibernate subquery

现在我已经尝试在我的数据库中执行查询了四天。

这是问题所在:

  1. 我有用户
  2. 用户可以有出生日期(可能为空)
  3. 我想列出没有 用户群组群组 用户,其中所有用户的生日为“null”
  4. 我能够轻松获得没有用户的组(我做了一个左连接),我的问题在于第二部分,获得所有用户为生日更新的组。

    到目前为止,这是我的代码:

    Criteria c = session.createCriteria(Group.class);
    c.createAlias("userCollection", "u", Criteria.LEFT_JOIN);
    c.add(Restrictions.or(Restrictions.isNull("userCollection"), 
                Restrictions.isNull("u.birthDate")));
    

    这样可以正常工作,但是当组中的用户的birthDate不为null时,该组仍会出现在查询中,因为该组中的其他人具有null生日。我想我需要使用不在,对吧?

    如果有人可以提供帮助,我尝试了很多,但我得到了空指针异常。

1 个答案:

答案 0 :(得分:2)

执行此操作的最简单方法是排除具有非空birthDate用户的组,该组同时处理这两个条件(由于内部联接,没有用户的组将不在此列表中)。

所以,比如:

DetachedCriteria excludedGroups = DetachedCriteria.forClass(Group.class);
excludedGroups.createAlias("userCollection", "u");
excludedGroups.add(Restrictions.isNotNull("u.birthDate"));
excludedGroups.setProjection(Projections.id());

Criteria c = session.createCriteria(Group.class);
c.add(Subqueries.propertyNotIn("id", excludedGroups));
顺便说一下,通过HQL这样做会更容易。