2011-08-04 71 views
0

我有2個表(實體)個人實體和度假實體。一個人可以有很多假期。簡單的HQL/sql查詢..需要幫助嗎?

我試圖做的是以下查詢:

選擇所有的人期間!但誰擁有一個假期的人,我希望獲取所有具有條件的人休假的,免得只說startDate是介於兩者之間。

只是要清楚,無論在假期我仍然希望得到所有persons.this的約束是我目前的HQL查詢:

select distinct p 
from Person as p 
left join fetch p.vacations as v 
where v.startDate between '2011-07-01' and '2011-07-30' 

它的問題是,它約束我的人的回報只有那些度假,尊重條件的人....有人可以幫忙嗎?

我有沒有問題,如果有人能告訴我這在本機SQL

UPDATE本地SQL感謝決心@Quasdunk:

SELECT * 
FROM person as p 
LEFT JOIN 
    (SELECT * FROM vacation 
     WHERE startDate BETWEEN '2011-08-01' AND '2011-08-30') as v ON v.person_id = p.id 

我的新問題是如何將其轉換爲HQL查詢所以我可以爲每個人提供假期,並且要求不同的人(條件保持不變)。

回答

1

在本地的SQL這將是:

SELECT * 
FROM person 
LEFT JOIN (SELECT * 
      FROM vacations 
      WHERE startDate BETWEEN '2011-07-01' AND '2011-07-30') 

未經檢驗的,但你的想法:)

+0

相當'噸....工作:d – Alexx

+0

@Alexx究竟是不是工作?表名是否正確?假期中的外籍人士是否與親朋同名(否則你必須加入...)? – Quasdunk

+0

您正在混合來自人員和休假的列,並返回更多行的列。像SELECT * FROM人p其中爲person_id中(從休假其中......選擇爲person_id),或在不PERSON_ID – ssedano

0

嘗試以下,

select p.*, v.* from PERSON p LEFT JOIN VACATION v on (p.id = v.p_id) where v.startDate between '2011-07-21' and '2011-07-22'

希望這對你的作品。

+0

對不起...但它同樣查詢作爲一個我張貼...不僅是SQL不hql..thx的幫助,雖然 – Alexx

+0

嘿亞歷克斯,我還挺測試了一個樣本數據。我認爲你也可以使用native sql。因此,在sql中的輸出。不知道爲什麼HQL版本顯示不同的數據。也許,你可以包含解釋計劃,或者你從HQL執行中獲得的樣本數據和輸出。 – rishi

+0

對於遲到的答案感到抱歉,但就像我之前說過的那樣..它不會做我想讓他做的事情......它只會返回那些有假期的人 – Alexx

0

您可能需要使用的功能來實現它:

select p from Person p 
where p.vacations.size = 0 
or (minelement(p.vacations) > '2011-07-01' 
    and 
    maxelement(p.vacations) < '2011-07-30') 

這些日期可能實際上是一個Date類型。取決於類型。

嘗試

select p from Person p 
where p.vacations.size = 0 
or (p.vacations.startDate > '2011-07-01' 
    and 
    p.vacations.endDate < '2011-07-30') 

你也應該看看here

0

在平原(我的)SQL它是這樣的:

select distinct p.* from person p 
left join vacations v on p.id = v.person_id 
where v.id is null or.v.start_date between '2011-07-01' and '2011-07-30' 

在HQL這將可能是(未經測試)

select distinct p from Person as p 
left join fetch p.vacations as v 
where v.id is null or v.startDate between '2011-07-01' and '2011-07-30' 

也許(我真的不知道這是否會工作)

select distinct p from Person as p 
left join fetch p.vacations as v 
where v is null or v.startDate between '2011-07-01' and '2011-07-30' 
+0

我已經做了類似這樣的作品,但只做了部分...因爲如果某人有假期,但開始日期不在間隔中,則它將返回空值,因爲假期方不爲空,並且也不尊重條件。 – Alexx