我有一个Cat类和一个Owner类。一只猫有一个主人,但主人可以有很多猫。我要查询的是让所有拥有蓝眼睛的猫的所有者。
class Cat {
Owner owner; //referenced from Owner.id
String eyeColor;
}
class Owner {
List<Cat> catList;
}
我尝试了一些代码,但我真的不知道该怎么做。
Criteria criteria = getCurrentSession().createCriteria(cat.getClass(), "cat");
criteria.createAlias("cat.owner", "owner");
criteria.add(Restrictions.eq("cat.eyeColor", "blue");
答案 0 :(得分:43)
标准只能选择投影或根实体。不是一些加入的实体。因此,有些查询无法用Criteria表达(除了更好的可读性和简洁性之外,这是使用HQL的一个更好的理由)。
但是,所有这些都不会丢失,因为您的关联是双向的。所以你只需要等效的HQL查询
select distinct owner from Owner owner
join owner.cats cat
where cat.eyeColor = 'blue'
哪个是
Criteria c = session.createCriteria(Owner.class, "owner");
c.createAlias("owner.cats", "cat");
c.add(Restrictions.eq("cat.eyeColor", "blue");
c.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
答案 1 :(得分:4)
试试这个:
DetachedCriteria dc = DetachedCriteria.forClass(Cat.class, "inner")
.add(Restrictions.eq("eyeColor", "blue"))
.add(Restrictions.eqProperty("inner.owner", "outer.id"));
session.createCriteria(Owner.class, "outer")
.add(Subqueries.exists(dc))
.list();
这可以使用数据库中的索引,并且不会像在@JB Nizet的版本中那样进行内存中distinct
操作(请参阅我的评论)。索引将是:
CREATE INDEX idx_cat_owner_eyecolor ON Cat(fkOwner, eyeColor)
将distinct
操作(在SQL或内存中)视为代码气味。它很少使用,许多新手程序员使用它来解决问题&#34;为什么我有两次这个行&#34;。它几乎总是可以重写,例如在这种情况下。必要时,用例很少。