75

我想使用 Hibernate 的标准 api 来制定一个连接两个实体的特定查询。假设我有两个实体,宠物和所有者,所有者有很多宠物,但至关重要的是,该关联没有映射到 Java 注释或 xml 中。

使用 hql,我可以通过在查询中指定联接来选择拥有名为“fido”的宠物的所有者(而不是将一组宠物添加到所有者类中)。

可以使用休眠标准完成相同的操作吗?如果有怎么办?

谢谢,J

4

5 回答 5

81

这确实可以通过以下标准实现:

DetachedCriteria ownerCriteria = DetachedCriteria.forClass(Owner.class);
ownerCriteria.setProjection(Property.forName("id"));
ownerCriteria.add(Restrictions.eq("ownername", "bob"));

Criteria criteria = getSession().createCriteria(Pet.class);
criteria.add(Property.forName("ownerId").in(ownerCriteria));

更新:这实际上执行子查询而不是连接,但它允许您在两个没有定义休眠关系的实体上使用标准。

于 2010-01-20T14:39:18.813 回答
63

我的理解是,如果您使用 HQL 执行此操作,您将创建一个带有过滤器的笛卡尔连接,而不是内部连接。条件查询不支持这样做。

于 2009-04-06T10:20:12.977 回答
1

在 NHibernate 中,您可以使用定义为 DetachedCriteria 的子查询。不确定它在 Java 中是否相同,很可能是相同的:

DetachedCriteria pets = DetachedCriteria.For<Pet>("pet")
  .SetProjection(Projections.Property("pet.ownername"))
  .Add(/* some filters */ );

session.CreateCriteria(typeof(Owner))
  .Add(Subqueries.PropertyIn("name", pets);

假设它是使用所有者的名称加入的。

于 2009-04-15T13:40:23.863 回答
0
Criterion ownerCriterion = Restrictions.sqlRestriction(SELECT ownerId FROM   Owner WHERE ownerName ='bob');
Criteria criteria = getSession().createCriteria(Pet.class);
criteria.createCriteria("ownerId").add(ownerCriterion);
于 2015-05-20T20:13:57.193 回答
-2

有一个SQLCriterion,你可以给任意SQL的,然后添加到你的Criteria. 在SQL字符串中,令牌 {alias} “将被根实体的别名替换。”

于 2009-04-06T11:38:27.830 回答