Sto cercando di fare un LEFT JOIN in Hibernate Query Language, in MySQL posso fare questo nel modo seguente:LEFT JOIN in Hibernate Query Language
select * from day_timetable_timeslots t LEFT JOIN golfnine_date_time_entity d ON d.start_time = t.start_time
Nella mia tabella day_timetable_timeslots ho molti intervalli di tempo per l'intera giornata con incrementi di 15 minuti. per esempio. 00:00:00, 00:15:00, 00:30:00, ... fino alla fine del giorno. Quindi mi mostra tutti gli intervalli di tempo con qualsiasi golfnine_date_time_entity corrispondente, ma non riesco a capire come farlo in Hibernate Query Language.
Bene, posso eseguire l'operazione LEFT JOIN dal seguente HQL.
selezionare o.id, book.id da DayTimetableTimeslots o join esterno sinistro o.bookings libro dove o.id> 0
Non so il motivo per cui io devo mettere l'o.id> 0 lì, ma funziona.
Tuttavia, desidero selezionare solo book.id dove la prenotazione ha una condizione. ho provato:
selezionare o.id, book.id da DayTimetableTimeslots o join esterno sinistro o.bookings libro dove o.id> 0 e book.dateTime.startDate> '2010-01-01'
Ma questo non funziona correttamente, mostra solo alcuni dei DayTimetableTimeslots, ma non tutti, come dovrebbe fare.
Fondamentalmente voglio fare questa query mysql in HQL.
selezionare t.id come start_time_sequence, t.start_time come all_start_time, d. * Da day_timetable_timeslots t LEFT JOIN golfnine_date_time_entity d ON d.start_time = t.start_time E t.customer_id = d.customer_id E d.start_date = '2010 -01-24' DOVE t.customer_id = 11
Grazie, Filippo
in MySQL posso fare quanto segue e mi mostra tutte le prenotazioni contro la loro orario di inizio. Tutti gli orari di inizio sono memorizzati in day_timetable_timeslots.
selezionare t.start_time, d.id da day_timetable_timeslots t 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'
... per tutta la giornata, abbina i ids del golfnine_date_time_entity con i tempi in day_timetable_timeslots.
La cosa buona di questa query mysql è che posso impostare alcuni criteri sulla prenotazione, ad es.
selezionare t.id, t.start_time, d.id da day_timetable_timeslots t LEFT JOIN golfnine_date_time_entity d ON d.start_time = t.start_time E t.customer_id = d.customer_id E d.start_date = '2010-01-24 ' Dove.customer_id = 11
ottengo
... 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
Così la sua mostrando solo la prenotazione in tale data specificata e l'ID cliente.
La sua così difficile da farlo in HQL ...
Questo è il join che voglio in HQL.
selezionare o.id, b.id da DayTimetableTimeslots o, LegacyDateTimeEntity b dove b.customer.id = 11 e b.startDate = '2010-02-07' e o.startTime = b.startTime
Fornisce questo 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
Ma - restituisce solo 1 fila perché solo un golfnine_date_time_entity corrisponde, voglio tutti i day_timetable_timeslots righe restituite.
Così ho provato in HQL.
selezionare o.id, o.bookings.size da DayTimetableTimeslots o sinistra unirsi o.bookings libro left join book.dateTime dt con dt.customer.id = 11 e dt.startDate = '2010/02/29' dove 1 = 1
Che purtroppo sembra ignorare l'espressione.
Restituisce questo 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
Il che unisce tutti i rapporti di corrispondenza tra le tabelle e ignora legacydate2_.customer_id = 11 e legacydate2_.start_date = '2010/02/29'
ho scoperto che questo sembra funzionare . Nota Mi riferisco a dt2 che è nella clausola with.
selezionare o.startTime distinto, dt2.id, book.uniqueDateTimeResource da DayTimetableTimeslots o unirsi fianco o.bookings libro con book.deleted = 0 rimasti unirsi book.dateTime dt2 con dt2.startDate = '2010-01-19' e dt2.deleted = 0
È possibile visualizzare l'SQL generato dal proprio HQL e alcuni dati di esempio con l'output che risulta e l'output desiderato? – RMorrisey
grazie, ho aggiunto più commenti alla mia domanda. – Phil