Hi,
   我在使用hibernate遇到了一个问题,需要大家帮忙解决    这里有A,B,C个表  A->B->C 的级联关系,A的实体 可以通过 B实体 访问C实体的属性字段.
             例如:String name = A.getB().getC().getName();
    问题:现在知道C表中Name字段有个"zhang3";该如何通过Hibernate查询"zhang3"对应的A实体.
             A                 B                   C
     id   type  bid    |  id   status  cid   | id    name   |
      1    猫    1     |   1     0      2    |  1     li4   |
      2    牛    2     |   2     5      1    |  2     zhang3|
类似这样根据B中status 为5 得到A对象为  :(2 牛 2)
A a = session.createCriteria(A.class)
             .createAlias("b", "ob")
             .add(Restrictions.eq("ob.status", 5))
             .uniqueResult();Best regards.
  
      XiangFang

解决方案 »

  1.   

    from A where a.b.c.name='zhang3';大致这个样子。
      

  2.   


    A a = session.createCriteria(A.class) 
         .createAlias("b", "ob",CriteriaSpecification.LEFT_JOIN) 
         .createAlias("ob.c", "oc",CriteriaSpecification.LEFT_JOIN) 
         .add(Restrictions.eq("oc.name", "zhang3")) 
         .uniqueResult();
      

  3.   

    您的是正解
    A a = session.createCriteria(A.class) 
         .createAlias("b", "ob") 
         .createAlias("ob.c", "oc") 
         .add(Restrictions.eq("oc.name", "zhang3")) 
         .uniqueResult();
      

  4.   

    期待朋友解决这样的问题A a = session.createCriteria(A.class) 
         .createAlias("b", "b") 
         .createAlias("b.c", "b.c") 
         .add(Restrictions.eq("b.c.name", "zhang3")) 
         .uniqueResult();我需要这样的方法  
    下面是实现
    public Criteria createCriteria(String[] property, Criterion... criterion){
    Criteria criteria = this.getSession().createCriteria(entityClass);
    for(String str : property){
    criteria.createAlias(str, str);
    }
    for(Criterion c : criterion){
    criteria.add(c);
    }
    return criteria;
    }
      

  5.   

    下面是一个Criteria无限级联查询,供参考String []str = new String[]{"b", "b.c","c.d"..............};//数组元素要写成string OR string.string的形式Session session = temp.getSession();
    Transaction tx = session.beginTransaction();Criteria c = session.createCriteria(A.class);
    for(String s : str){
        c.createAlias(s, s.replaceFirst("\\w+\\.", ""));
    }
    c.add(Restrictions.eq("x.id", 10));//此处写最后的查询条件,Ex:查的是x的id
    List<A> list = c.list();
    tx.commit();
    Iterator<A> iter = list.iterator();
    while(iter.hasNext()){
        A a = iter.next();
        System.out.println(a.getId() + "===" + card.getA().getId() + "+++" + card.getA().getB().getId()+............);
    }
      

  6.   

    同意一楼的, from A as a where a.tbB.tbC.name='zhang3'。