Hibernate条件:没有映射关联的连接表

时间:2009-04-06 07:37:40

标签: java hibernate hql criteria

我想使用Hibernate的标准api来制定一个连接两个实体的特定查询。假设我有两个实体,Pet和Owner,拥有许多宠物,但关键是这种关联没有映射到Java注释或xml中。

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

可以使用休眠标准完成相同的操作吗?如果是这样的话?

谢谢, Ĵ

5 个答案:

答案 0 :(得分:77)

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

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));

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

答案 1 :(得分:61)

我的理解是,如果使用HQL执行此操作,则使用过滤器而不是内部联接创建笛卡尔联接。 Criteria查询不支持这样做。

答案 2 :(得分: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);

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

答案 3 :(得分:0)

Criterion ownerCriterion = Restrictions.sqlRestriction(SELECT ownerId FROM   Owner WHERE ownerName ='bob');
Criteria criteria = getSession().createCriteria(Pet.class);
criteria.createCriteria("ownerId").add(ownerCriterion);

答案 4 :(得分:-2)

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