首页 文章

Hibernate条件:没有映射关联的连接表

提问于
浏览
69

我想使用Hibernate的标准api来制定一个连接两个实体的特定查询 . 假设我有两个实体,Pet和Owner,拥有许多宠物,但关键是这种关联没有映射到Java注释或xml中 .

使用hql,我可以通过在查询中指定连接来选择拥有名为'fido'的宠物的所有者(而不是将一组宠物添加到所有者类) .

可以使用休眠标准完成相同的操作吗?如果是这样的话?

谢谢,J

5 回答

  • -2

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

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

    Update :这实际上执行子查询而不是连接,但它允许您在两个没有定义休眠关系的实体上使用Criteria .

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

    有一个 SQLCriterion ,你可以给任意 SQL ,并添加到你的 Criteria . 在 SQL 字符串中,令牌 "will be replaced by the alias of the root entity."

相关问题