2013-10-22 48 views
0

我們試圖通過HQL執行以下查詢,但我們被卡住了,並且此查詢未向我們顯示任何結果。休眠查詢使用或不顯示結果

select s from Serie s where 
(s.arrivalSerie is not null and s.arrivalSerie.company.isEnable=1) 
or (s.departureSerie is not null and s.departureSerie.company.isEnable=1) 

我們拋出這個查詢有:

Query query = em.createQuery("previous query"); 
query.setFirstResult(initialElement); 

雖然測試此查詢,我們發現了這個查詢(「或」)可以用結果來執行的任何部分。但是當整個查詢被執行時,我們得到0個元素集合。

任何想法?

UPDATE:

的理解翻譯的查詢會是這樣的:

select 
     s.* 
    from 
     serie s, 
     arrivalSerie a, 
     company ca, 
     departureSerie d, 
     company cd 
    where 
     s.idArrivalSerie=a.idArrivalSerie 
     and a.CompanyCode=ca.CompanyCode 
     and s.idDepartureSerie=d.idDepartureSerie 
     and d.CompanyCode=cd.CompanyCode 
     and (
      (
       s.idArrivalSerie is not null 
      ) 
      and ca.isEnable=1 
      or (
       s.idDepartureSerie is not null 
      ) 
      and cd.isEnable=1 
     ) limit 0,10; 

當然這是不向我們展示結果在一個MySQL客戶

+0

你能檢查從這個hql生成的sql嗎? –

+0

您可以通過在hibernate配置中將show-sql屬性設置爲true來進行調試,控制檯將打印生成的SQL查詢,您可以在數據庫中運行它並查找。 – Zeus

+0

變量'initialElement'包含什麼?如果你想要第一個元素,你應該把它設置爲0. – Paolo

回答

0
s.arrivalSerie.company 

創建一個內部聯接在SerieArrivalSerie之間,以及ArrivalSerieCompany之間的另一個內部聯接。並且內部聯接會過濾出所有具有null arrivalSerie的系列,這顯然不是您想要的。所以你需要使用左連接代替:

select s from Serie s 
left join s.arrivalSerie arrivalSerie 
left join arrivalSerie.company arrivalCompany 
left join s.departureSerie departureSerie 
left join departureSerie.company departureCompany 
where arrivalCompany.isEnable = 1 or departureCompany.isEnable = 1 
+0

謝謝,我們終於找到了自己的解決方案。無論如何,解釋讚賞(老實說,我們不知道到底是什麼與最初的查詢發生)。 –

+0

您應該在開發過程中始終打開SQL日誌記錄,查看Hibernate如何將HQL轉換爲SQL,並找出造成此類問題的原因。 –