有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Hibernate标准:在没有映射关联的情况下连接表

我想使用Hibernate的CriteriaAPI来制定连接两个实体的特定查询。假设我有两个实体,Pet和Owner,其中一个所有者有许多Pet,但至关重要的是,这种关联没有映射到Java注释或xml中

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

使用hibernate标准是否也可以做到这一点?如果是,怎么做

谢谢, J


共 (5) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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

  3. # 3 楼答案

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

    假设它是使用所有者的名称连接的

  4. # 4 楼答案

    根据以下标准,这确实是可能的:

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

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

  5. # 5 楼答案

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