已知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的表先进行条件的筛选。
调试欢乐多
我怎么觉得你的这个hql语句是正确的呢
我上面的那种写法,语法没有问题,显示的数据会变少。例如a表中有10条数据,b表2条,left join 后显示的b的字段中会有很多null(b.userInfo.id)值,oracle中这时候再加上筛选条件b.userInfo.id=1 ,就变成结果2条数据了。
我想要的是b表先筛选条件**.id=1,然后再a左连接b出来的效果。
达到人数后开始培训!欢迎加入探讨,提问题!
=============================================
《企业应用架构模式》pdf 系列书籍已经上传至群共享,欢迎下载!
能够经常提问及回答问题的朋友,可以得到群主的精美小礼品,赶紧加入吧!
不过可以通过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();