JPA QL 中使用外连接遇到的问题和解决方式

  这次遇到了一个问题,涉及到了四个实体,进行匹配模糊查询。  其中facility实体引用address实体,address实体引用country实体和state实体,facility实体是主实体(其对应的表是主表)。   事情的起因是,当对facility实体及其他关联实体进行联合模糊查询时,有的数据没有被检索出来。还有,查询语句是写成了JPA QL的形式“select o from Facility o    where o.objAccount.acntId = 1  and o.facStatus = 1  and (lower(o.strFacilityName) like 'cer%' or lower(o.addressesList.addAddress1) like 'cer%' or lower(o.addressesList.addCity) like 'cer%' or lower(o.addressesList.states.stateName) like 'cer%' or lower(o.addressesList.countries.countryName) like 'cer%') order by o.strFacilityName asc”.   当时,想到了,可能是,因为表与表之间的连接是内连接,所以应该使用外连接,但是,只用原始sql写过外连接语句,这个jpa sql中怎么写外连接还真是不知道。于是开始了尝试,写了很多种都没有通过运行解析。   今天,忽然想到了逐步实现,即先尝试让facility实体和address实体的关联,“select o from Facility o  left join o.addressesList  p where o.objAccount.acntId = 1  and o.facStatus = 1  and (lower(o.strFacilityName) like 'cer%' or lower(p.addAddress1) like 'cer%' or lower(p.addCity) like 'cer%' ) order by o.strFacilityName asc”. 结果,成功了,基本上可以肯定了,jpa sql对外连接的解析方式是通过对于别名的嵌套关系了生成最终的sql语句的。所以,最终的sql语句是“select o from Facility o left join o.addressesList p left join p.countries c left join p.states s   where o.objAccount.acntId = 1  and o.facStatus = 1  and (lower(o.strFacilityName) like 'cer%' or lower(p.addAddress1) like 'cer%' or lower(p.addCity) like 'cer%' or lower(s.stateName) like 'cer%' or lower(c.countryName) like 'cer%') order by o.strFacilityName asc”   现在还有一些疑问,有的资料上说,ejb3默认表与表之间的关联是左外连接。那就奇怪了,我之前写的jpa sql为什么没有检索出相应的数据呢,难道是我写的条件把外连接变成了内连接?我写jpa sql的过程中,注意到一个问题,一旦前面指定了各个别名,后面的条件必须用别名来引用字段,否则,还是被当内连接来看待。看来为where条件中的写法“o.addressesList.states.stateName” 和 “o.addressesList.countries.countryName” 很可能是重新建立了各个表之间的内连接关系。当然这个我还需进一步的确认。

  以上,是我,经过一些冥思苦想最终解决问题之后的总结。中间经过很多曲折,上网不论baidu还是google都没有类似的例子,这次一定要记好。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值