2010-08-15 49 views
6

我試圖做一個LEFT JOIN在Hibernate查詢語言,MySQL中我能做到這一點,如下所示:LEFT JOIN在Hibernate查詢語言

SELECT * FROM day_timetable_timeslots牛逼LEFT JOIN golfnine_date_time_entity d ON d.start_time = t.start_time

在我的表day_timetable_timeslots我有很多時間間隔爲15分鐘的增量全天。例如。 00:00:00,00:15:00,00:30:00,...到一天結束。 因此,它顯示我與任何匹配golfnine_date_time_entity的所有時間間隔,但我似乎無法解決如何在Hibernate查詢語言中執行此操作。

那麼我可以通過以下HQL做LEFT JOIN。

選擇o.id,book.id從DayTimetableTimeslotsØ左外連接o.bookings本書,o.id> 0

我不知道爲什麼我必須把o.id> 0在那裏,但它的作品。

但是,我只想選擇book.id的預訂有哪裏條件的地方。 我想:

選擇o.id,book.id從DayTimetableTimeslotsØ左外連接o.bookings本書,o.id> 0和book.dateTime.startDate> '2010-01-01'

但是這不能正常工作,它只顯示一些DayTimetableTimeslots,但不是所有的,因爲它應該這樣做。

我基本上想在HQL中做這個mysql查詢。

從day_timetable_timeslots選擇t.id如start_time_sequence,t.start_time如all_start_time,d。* T LEFT JOIN golfnine_date_time_entity d ON d.start_time = t.start_time AND t.customer_id = d.customer_id AND d.start_date =「2010 -01-24' WHERE t.customer_id = 11

謝謝你,菲利普


在MySQL中我可以做以下的,它表明了我對他們的啓動時間所有預訂。所有開始時間都存儲在day_timetable_timeslots中。

選擇t.start_time,d.id從day_timetable_timeslots牛逼LEFT JOIN golfnine_date_time_entity d ON d.start_time = t.start_time

'00:00:00', NULL 
'00:15:00', NULL 
'00:30:00', NULL 
'00:45:00', NULL 
'01:00:00', '443' 
'01:15:00', NULL 
'01:30:00', NULL 
'01:45:00', NULL 
'02:00:00', '444' 

...了整整一天,它golfnine_date_time_entity的ID相匹配與day_timetable_timeslots中的時間。

關於這個mysql查詢的好處是我可以在預訂上設置一些標準,例如。

從day_timetable_timeslots中選擇t.id,t.start_time,d.id t LEFT JOIN golfnine_date_time_entity d ON d.start_time = t.start_time AND t.customer_id = d.customer_id AND d.start_date ='2010-01-24 '哪裏。CUSTOMER_ID = 11

我得到

... lots of data then 
'31', '07:15:00', NULL 
'32', '07:30:00', NULL 
'33', '07:45:00', NULL 
'34', '08:00:00', '501' 
'35', '08:15:00', NULL 
'36', '08:30:00', NULL 
'37', '08:45:00', NULL 
'38', '09:00:00', NULL 
'39', '09:15:00', NULL 
... lots more data 

因此,它只能顯示在指定的日期和用戶ID預訂。

其所以很難做到這一點HQL ...


這是加盟我想在HQL。

選擇o.id,b.id從DayTimetableTimeslots O,LegacyDateTimeEntity b其中b.customer.id = 11和b.startDate = '2010-02-07' 和o.startTime = b.startTime

給出這個SQL。

select 
    daytimetab0_.id as col_0_0_, 
    legacydate1_.id as col_1_0_ 
from 
    day_timetable_timeslots daytimetab0_, 
    golfnine_date_time_entity legacydate1_ 
where 
    legacydate1_.customer_id=11 
    and legacydate1_.start_date='2010-02-07' 
    and daytimetab0_.start_time=legacydate1_.start_time 

但是 - 這不僅是因爲只有一個golfnine_date_time_entity匹配,則返回1行,我想所有的行返回的day_timetable_timeslots的。

所以我嘗試了HQL。

從DayTimetableTimeslots中選擇o.id,o.bookings.size o left join o.bookings book left join book.dateTime dt with dt.customer.id = 11 and dt.startDate ='2010-02-29'where 1 = 1

這可悲似乎忽略了與表達。

它返回這個SQL。

select 
    daytimetab0_.id as col_0_0_, 
    (select 
     count(bookings3_.timeslot_id) 
    from 
     golfnine_booking bookings3_ 
    where 
     daytimetab0_.id=bookings3_.timeslot_id) as col_1_0_ 
from 
    day_timetable_timeslots daytimetab0_ 
left outer join 
    golfnine_booking bookings1_ 
     on daytimetab0_.id=bookings1_.timeslot_id 
left outer join 
    golfnine_date_time_entity legacydate2_ 
     on bookings1_.date_time_id=legacydate2_.id 
     and (
      legacydate2_.customer_id=11 
      and legacydate2_.start_date='2010-02-29' 
     ) 
where 
    1=1 

剛剛加入表之間的所有匹配的關係,而忽略 legacydate2_.customer_id = 11 和legacydate2_.start_date = '2010年2月29日'


我發現,這似乎工作。注意我正在引用dt2,它在with子句中。

從DayTimetableTimeslots中選擇不同的o.startTime,dt2.id,book.uniqueDateTimeResource o將book.deleted = 0的book加入到book.deleted = 0左邊加入book.dateTime dt2 with dt2.startDate ='2010-01-19'和dt2.deleted = 0

+0

您可以顯示您的HQL生成的SQL,以及一些帶有輸出結果和期望輸出的示例數據嗎? – RMorrisey 2010-08-15 15:56:03

+0

謝謝,我對我的問題添加了更多評論。 – Phil 2010-08-15 16:10:31

回答

1

我能想到的,你正在運行到兩個潛在的問題:您有您的Java和SQL代碼之間的日期/時間精度問題

  1. 。您可以嘗試以小增量調整日期,並查看是否顯示正確的值。

  2. 您的休眠映射不正確。它看起來像你總是加入多列?你的模式對我來說有點混亂。您是否使用@JoinColumns註釋來指定關聯中的多個列(如果您使用註釋)或XML映射文件中的等效項?