现在有这么一个关系 Apply类中有个属性xDataEntity(XDataEntity),Apply和XDataEntity是一对一得关系 
XDataEntity类中有个fields属性(Set <XDataDetailEntity>)XDataEntity和XDataDetailEntity(属性:name,value)是一对多的关系 现在问题是这样的 我想查询出 Apply.getXDataEntity.getFields集合中必须同时存在对象A(name='a' and value='1') 和对象B(name='b' and value='2')的所有满足条件的Apply的所有记录(哈哈,感觉有点绕),仅存在其中一个对象(A or B)是不符合要求的 这样的要求不知道用HQL怎么写了,感觉很难写,请各位帮忙了,哈哈,多谢了啊 其中我是这样写的:select apply from Apply as apply left outer join apply.xDataEntity.fields as field where (field.name='a' and field.value = 1 ) or (field.name='b' and field.value =2 )这样可以查询出来,但是(仅存在其中一个对象(A or B)是不符合要求的)这样是不合要求啊,哎,不知道怎么写了啊!请大家帮帮忙啊

解决方案 »

  1.   

    把 or 改成and 啊
    或者
    只查apply.xDataEntity.fields 字段 自连接查询。
      

  2.   

    字太多,劳累了一天,眼睛看不清楚这么多字了,SQL 会写吗,SQL 得出的结果,把字段和表换成 Model属性和Model
      

  3.   

    不行就用原生sql,逻辑应该很简单吧
      

  4.   

    select apply from Apply as apply left outer join apply.xDataEntity.fields as field where field.name in('a','b') and field.value in( 1,2) 
      

  5.   

    学习了大家的高见之后,还是想谈谈自己的想法:1. 楼主这个问题单纯用hql来解决的话,我想是可以的。尽管我不会。2. 4楼的那个hql我试了一下。好像把那些name='a' and value='2',name='b' and value='1'的也给读进来了。3. 既然高手的方案似乎也有问题,看来这个hql一定很难很难。4. 于是我想能不能把hql和Hibernate自身的一些特性结合起来来解决这个问题呢?5. 首先把楼主hql拆成两个,一个专门读name='a' and value='1'的Apply, 另一个专门读name='b' and value='2'的Apply:String hql1 = "select apply from Apply as apply left outer join apply.xDataEntity.fields as field "
    + "where field.name='a' and field.value = 1"; String hql2 = "select apply from Apply as apply left outer join apply.xDataEntity.fields as field "
    + "where field.name='b' and field.value =2";                Query query1 = session.createQuery(hql1);
    Query query2 = session.createQuery(hql2); List<Apply> applys1 = (List<Apply>) query1.list();
    List<Apply> applys2 = (List<Apply>) query2.list();
    6. 然后将上面的两个List经过一些处理后放入一个HashSet里,就可以满足楼主的要求了:for (Apply apply1 : applys1) {
    for (Apply apply2 : applys2) {
    if (apply2 == apply1) {
    applySet.add(apply2);
    }
    }
    } for (Apply apply : applySet) {
    for (XDataDetailEntity detailEntity : apply.getxDataEntity()
    .getFields()) {
    System.out.println(detailEntity.getName() + " "
    + detailEntity.getValue());
    }
    }7. 上面代码的根据是,如果一个Apply的对象即在applys1里(满足条件:name='a' and value='1'),又在applys2里(满足条件:name='b' and value='2'),那么这个对象就是我们想要的。8. 上面代码用到了:
        if (apply2 == apply1) {
    applySet.add(apply2);
        }
        它的依据是:
         如果两个对象(A and B)有同样的数据库ID 并且在同一个Session里, 我们可以推出 A == B以上想法很不成熟,希望大家不要见笑。
      

  6.   

    select apply from Apply as apply left outer join apply.xDataEntity.fields as field where (field.name='a' and field.value = 1 ) and (field.name='b' and field.value =2 )
      

  7.   


    上面这个hql相当于:
    SELECT * FROM orders where id = 2 and id = 3;
    这样的查询会有结果吗?
      

  8.   

    可以试试:select apply from Apply apply, XDataDetailEntity xd1, XDataDetailEntity xd2 where (xd1.name='a' and xd1.value = 1 and xd1 member of apply.xDataEntity.fields) and (xd2.name='b' and xd2.value = 2 and xd2 member of apply.xDataEntity.fields)
      

  9.   

    跟我遇到的问题差不多可以找Hibernate的HQL关于left join的主题看看,HQL在这方面的写法和SQL有差别
      

  10.   

    hql不会 就先写出sql语句啊
    直接用hibernate的原生sql查询