Hibernate的left join fetch 查询条件问题

pp_bird 2008-04-18 05:35:59
当A left join fecth B的时候,怎么对B的条件进行进一步的筛选?
eg:
表VoteGroup:投票组的信息
id,
name

表VoteStatus:用户对该组的投票的状态
id,
VoteGroup.id,外键
UserInfo.id,外键

表UserInfo:用户表

两表已建立映射关系。VoteGroup与VoteStatus一对多,。UserInfo与VoteStatus一对多。
如果只单纯地左连接,hql="from VoteGroupa LEFT JOIN FETCH a.voteStatus order by a.id "没有问题,
但如果加上对VoteStatus的UserInfo.id=1的筛选,怎么个写法?

...全文
562 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Limdzh 2008-04-19
  • 打赏
  • 举报
回复
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();
zhang5911 2008-04-19
  • 打赏
  • 举报
回复
架构师交流群:59048426,已经上传google 、 eBay、Youtube等顶级软件产品的架构分析!资料陆续上传中。
达到人数后开始培训!欢迎加入探讨,提问题!
=============================================
《企业应用架构模式》pdf 系列书籍已经上传至群共享,欢迎下载!
能够经常提问及回答问题的朋友,可以得到群主的精美小礼品,赶紧加入吧!

pp_bird 2008-04-19
  • 打赏
  • 举报
回复
回oxoxo:
我上面的那种写法,语法没有问题,显示的数据会变少。例如a表中有10条数据,b表2条,left join 后显示的b的字段中会有很多null(b.userInfo.id)值,oracle中这时候再加上筛选条件b.userInfo.id=1 ,就变成结果2条数据了。
我想要的是b表先筛选条件**.id=1,然后再a左连接b出来的效果。
pp_bird 2008-04-19
  • 打赏
  • 举报
回复
奇怪,怎么显示不了回复?
bojianyu 2008-04-19
  • 打赏
  • 举报
回复
......
bojianyu 2008-04-19
  • 打赏
  • 举报
回复
......
oxoxo 2008-04-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pp_bird 的回复:]
已知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的表先进行条件的筛选。
[/Quote]

我怎么觉得你的这个hql语句是正确的呢
pp_bird 2008-04-18
  • 打赏
  • 举报
回复
已知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的表先进行条件的筛选。

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧