hibernate标准:没有映射关联的连接表
我想使用Hibernate的标准API来制定一个连接两个实体的特定查询。 比方说,我有两个实体,宠物和拥有者拥有多个宠物的所有者,但关键的是该关联没有映射到Java注释或XML中。
通过hql,我可以通过在查询中指定连接(而不是将一组宠物添加到所有者类)来select拥有名为“fido”的宠物的所有者。
同样可以使用hibernate条件吗? 如果这样怎么样?
谢谢,J
我的理解是,如果你使用HQL来做这件事,那么你就是用一个filter创build一个笛卡尔联接,而不是一个内部联接。 标准查询不支持这样做。
这确实是可能的标准:
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));
更新 :这实际上是执行一个子查询,而不是一个连接,但它允许您在两个没有定义hibernate关系的实体上使用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);
假定它是使用所有者的名字join的。
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
string中,标记{别名}将被replace为根实体的别名。