這次遇到了一個問題,涉及到了四個實體,進行匹配模糊查詢。 其中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都沒有類似的例子,這次一定要記好。