0

假设我有以下两个课程;用户和位置。我想创建一个 DetachedCriteria 来查询用户表,并返回所有没有名称为“xyz”的位置的用户。

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    Long id;

    @CollectionOfElements
    Set<Location> locations;
}

@Entity
public class Location{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    Long id;

    @Column
    String name;
}

以下代码将返回所有设置了名称为“xyz”的位置的用户:

DetachedCriteria dc = DetachedCriteria.forClass(User.class);
dc.createCriteria("locations")
     dc.add(Restrictions.eq("name", "xyz"));

如果我更改为 Restrictions.ne(),那将不起作用,因为它只会返回实际设置了位置的用户。此外,如果为用户设置了一堆位置,它将一遍又一遍地复制该用户。

有任何想法吗?

4

2 回答 2

1

使用原始帖子中描述的实体用户位置:

1)检查关联位置是否为空。

Junction or = Restrictions.disjunction();
or.add(Restrictions.isEmpty("locations"));

2)使用LEFT_JOIN和要在“ ne ”限制中使用的别名创建位置的关联标准。LEFT_JOIN 是必需的,因此即使位置关系为空,我们仍然可以取回用户记录。

userCriteria.createCriteria("locations", "loc", Criteria.LEFT_JOIN);
or.add(Restrictions.ne("loc.name", "xyz"));

3)将析取添加到原始用户标准。

userCriteria.add(or);
于 2012-03-09T00:04:48.880 回答
0

您可能需要使用 、 和 的某种组合Restrictions.and()才能Restrictions.not()使Restrictions.or()Restrictions.in()的逆逻辑正常工作。检查http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/criterion/Restrictions.html - 绝对可以!

为确保您只能获得 at-most-one User,请Distinct通过Projections.distinct()工厂方法 (http: //docs.jboss.org/hibernate/core/3.5/api/org/hibernate/criterion/Projections.html)-即:

dc.setProjection(Projections.distinct(Projections.property("id")));

像这样的东西应该做你需要的。

于 2011-05-25T00:26:27.643 回答