我想使用Hibernate的标准api来制定一个连接两个实体的特定查询。假设我有两个实体,Pet和Owner,拥有许多宠物,但关键是这种关联没有映射到Java注释或xml中。
使用hql,我可以通过在查询中指定连接来选择拥有名为'fido'的宠物的所有者(而不是将一组宠物添加到所有者类中)。
可以使用休眠标准完成相同的操作吗?如果是这样的话?
谢谢, Ĵ
答案 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}“将被根实体的别名替换。”