2011-07-22 29 views
1

四天了,我一直在尝试在我的数据库中执行查询。如何检索使用标准,分离标准和子查询的对象

继承人的问题:

  1. 我有一个集团用户
  2. 用户可以有出生日期(可能为null)
  3. 我想列出用户 AND 用户其中所有用户都具有“空”的生日

我能够很容易地获取没有用户组(我做了左连接),我的问题是与第二部分,获取所有用户在出生日期为空的组。

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

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

这工作得很好,但是当组中的用户有一个生日不空群仍出现在查询中,因为其他组中有null生日。我想我需要使用而不是,对不对?

如果有人可以帮忙,我尝试了很多,但我得到一个空指针异常。

回答

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

BTW,通过HQL这样做会更容易。

+0

它抛出一个sql异常说:未知列'u.birthDate'。 – fredcrs

+0

它看起来好像没有在子查询中进行内连接 – fredcrs