我想使用Hibernate的标准api来制定一个连接两个实体的特定查询 . 假设我有两个实体,Pet和Owner,拥有许多宠物,但关键是这种关联没有映射到Java注释或xml中 .
使用hql,我可以通过在查询中指定连接来选择拥有名为'fido'的宠物的所有者(而不是将一组宠物添加到所有者类) .
可以使用休眠标准完成相同的操作吗?如果是这样的话?
谢谢,J
我的理解是,如果使用HQL执行此操作,则使用过滤器而不是内部联接创建笛卡尔联接 . Criteria查询不支持这样做 .
这确实可以通过以下标准实现:
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));
Update :这实际上执行子查询而不是连接,但它允许您在两个没有定义休眠关系的实体上使用Criteria .
在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);
假设它是使用所有者的名称加入的 .
Criterion ownerCriterion = Restrictions.sqlRestriction(SELECT ownerId FROM Owner WHERE ownerName ='bob'); Criteria criteria = getSession().createCriteria(Pet.class); criteria.createCriteria("ownerId").add(ownerCriterion);
有一个 SQLCriterion ,你可以给任意 SQL ,并添加到你的 Criteria . 在 SQL 字符串中,令牌 "will be replaced by the alias of the root entity."
SQLCriterion
SQL
Criteria
5 回答
我的理解是,如果使用HQL执行此操作,则使用过滤器而不是内部联接创建笛卡尔联接 . Criteria查询不支持这样做 .
这确实可以通过以下标准实现:
Update :这实际上执行子查询而不是连接,但它允许您在两个没有定义休眠关系的实体上使用Criteria .
在NHibernate中,您可以使用定义为DetachedCriteria的子查询 . 不确定它在Java中的工作原理是否相同,很可能是相同的:
假设它是使用所有者的名称加入的 .
有一个
SQLCriterion
,你可以给任意SQL
,并添加到你的Criteria
. 在SQL
字符串中,令牌 "will be replaced by the alias of the root entity."