这次遇到了一个问题,涉及到了四个实体,进行匹配模糊查询。 其中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都没有类似的例子,这次一定要记好。