【问题标题】:Hibernate: Criteria API: Query entities which do not contain a specified element in a CollectionOfElements?Hibernate:Criteria API:查询不包含 CollectionOfElements 中指定元素的实体?
【发布时间】:2011-05-24 22:46:54
【问题描述】:

假设我有以下两个类;用户和位置。我想创建一个 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(),那将不起作用,因为它只会返回实际设置了位置的用户。此外,如果为用户设置了一堆位置,它将一遍又一遍地复制该用户。

有什么想法吗?

【问题讨论】:

    标签: java hibernate hibernate-criteria


    【解决方案1】:

    使用您原始帖子中描述的实体 UserLocation

    1) 检查关联的locations是否为空。

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

    2) 使用 LEFT_JOIN 和要在“ne”限制中使用的别名为 locations 创建关联条件。 LEFT_JOIN 是必需的,因此即使 locations 关系为空,我们仍会返回 User 记录。

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

    3) 将析取添加到原始 User 标准中。

    userCriteria.add(or);
    

    【讨论】:

      【解决方案2】:

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

      为确保您最多只能获得一个 User,请使用 Distinct 投影 (http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/criterion/Distinct. html)通过Projections.distinct()工厂方法(http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/criterion/Projections.html)-即:

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

      类似的东西应该可以满足您的需要。

      【讨论】:

        猜你喜欢
        • 2010-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-10
        相关资源
        最近更新 更多