我想使用Hibernate的条件api来制定连接两个实体的特定查询。假设我有两个实体,Pet和Owner,拥有者拥有很多宠物,但是至关重要的是,该关联未映射到Java批注或xml中。
使用hql,我可以通过在查询中指定联接来选择拥有“ fido”宠物的主人(而不是将一组宠物添加到owner类)。
是否可以使用休眠条件进行相同操作?如果可以,怎么办?
谢谢,J
Answers:
我的理解是,如果使用HQL进行此操作,则将使用过滤器而不是内部联接创建笛卡尔联接。条件查询不支持这样做。
with
子句
确实可以使用以下条件:
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));
更新:实际上,这将执行子查询而不是联接,但是它允许您在未定义休眠关系的两个实体上使用条件。
在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);
假设使用所有者名称将其加入。
有一个SQLCriterion
,您可以任意指定SQL
,然后添加到中Criteria
。在SQL
字符串中,标记{alias}“将被根实体的别名替换。”