已知hql="from VoteGroup as a LEFT JOIN FETCH a.voteStatus as b WHERE b.userInfo.id=1 order by a.id "是错误的。因为他是在a左连接b的结果后再加上条件**.id=1,因为left join 后b有为空的字段,oracle显示的数据条数会变少。想要的效果实际上是左连接之前b的表先进行条件的筛选。

解决方案 »

  1.   


    我怎么觉得你的这个hql语句是正确的呢
      

  2.   

    回oxoxo:
    我上面的那种写法,语法没有问题,显示的数据会变少。例如a表中有10条数据,b表2条,left join 后显示的b的字段中会有很多null(b.userInfo.id)值,oracle中这时候再加上筛选条件b.userInfo.id=1 ,就变成结果2条数据了。
    我想要的是b表先筛选条件**.id=1,然后再a左连接b出来的效果。
      

  3.   

    架构师交流群:59048426,已经上传google 、 eBay、Youtube等顶级软件产品的架构分析!资料陆续上传中。 
    达到人数后开始培训!欢迎加入探讨,提问题! 
    ============================================= 
    《企业应用架构模式》pdf 系列书籍已经上传至群共享,欢迎下载!
    能够经常提问及回答问题的朋友,可以得到群主的精美小礼品,赶紧加入吧!
      

  4.   

    hql在左连接的时候好像没有办法再设置条件。
    不过可以通过filter来实现。
    在你的映射表VoteGroup.xml中,配置filter:
    <set name="voteStatus" inverse="true" >
      <key column="voteGroup_id" />
      <one-to-many class="VoteGroup" />
      <filter name="sqlfilter" />
    </set><filter-def name="sqlfilter" condition="id=:id" >
    <filter-param name="sqlfilter" type="int" />
    </filter-def>调用时,
    session.enableFilter("sqlfilter").setParameter("id",1);
    List list=session.createQuery("from VoteGroup as a LEFT JOIN FETCH a.voteStatus as b order by a.id ").list();