如何解决休眠:标准API:查询在CollectionOfElements中不包含指定元素的实体?
| 假设我有以下两个课程;用户和位置。我想创建一个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(),那将不起作用,因为它只会返回实际设置了位置的用户。另外,如果为用户设置了一堆位置,它将一遍又一遍地复制该用户。
有任何想法吗?
解决方法
使用原始帖子中所述的实体用户和位置:
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);
,您可能需要使用Restrictions.and()
,Restrictions.not()
,Restrictions.or()
和Restrictions.in()
的某种组合才能使逆逻辑正常工作。检查http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/criterion/Restrictions.html-绝对可以做到!
要确保最多只能得到一个9英镑,请通过11工厂方法使用10英镑投影(http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/criterion/Distinct.html) (http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/criterion/Projections.html)-即:
dc.setProjection(Projections.distinct(Projections.property(\"id\")));
这样的事情应该可以满足您的需求。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。