休眠条件:没有映射关联的联接表


71

我想使用Hibernate的条件api来制定连接两个实体的特定查询。假设我有两个实体,Pet和Owner,拥有者拥有很多宠物,但是至关重要的是,该关联未映射到Java批注或xml中。

使用hql,我可以通过在查询中指定联接来选择拥有“ fido”宠物的主人(而不是将一组宠物添加到owner类)。

是否可以使用休眠条件进行相同操作?如果可以,怎么办?

谢谢,J

Answers:


62

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


David对此是正确的,您无法使用Criteria来实现,而可以使用HSQL来实现
Gareth Davis 2009年

1
有谁知道是否仍然无法使用条件查询来加入未映射的实体?
彼得·柯比

我认为可以使用HQLwith 子句
Suganthan Madhavan Pillai,2015年

@Suganthan不,不可能,只是在工作中进行了测试,因为我们有类似的问题。
塔里克

@DavidM是赞成票,因为这是明确正确的,并且因为我真的不明白为什么选择赞成票!
塔里克

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

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


1
为什么会有这么多的赞成票?还是两个不同的标准吧?
Reddy

37
问题是这不是联接,而是子查询-这意味着您无法按第一个条件的列对结果进行排序。
马丁·拉扎

1
我猜它变成了子查询而不是
联接

我必须在表和视图之间进行查询,并且没有显式关联。这很好。
安吉拉2012年

如何检索结果?我可以作为List <Owner,List <Pet >>获得吗?
Trind

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

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


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

-2

有一个SQLCriterion,您可以任意指定SQL,然后添加到中Criteria。在SQL字符串中,标记{alias}“将被根实体的别名替换。”


2
这该怎么做?有什么例子吗?
iPhoneJavaDev

没有提供示例或(至少)链接。
n3k0

SQLCriterion已保护构造函数
AndreyT 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.