2010-08-15 16 views
6

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

+0

È possibile visualizzare l'SQL generato dal proprio HQL e alcuni dati di esempio con l'output che risulta e l'output desiderato? – RMorrisey

+0

grazie, ho aggiunto più commenti alla mia domanda. – Phil

risposta

1

mi vengono in mente due possibili problemi che si esegue in:

  1. si hanno problemi con precisione data/ora tra il Java e il codice SQL. Puoi provare ad aggiustare la data con un piccolo incremento e vedere se i valori corretti vengono visualizzati.

  2. La mappatura in stato di ibernazione non è corretta. Sembra che tu ti unisca sempre su più colonne? Il tuo schema mi confonde un po '. Utilizzi l'annotazione @JoinColumns per specificare più colonne nella tua associazione (se stai utilizzando le annotazioni) o l'equivalente nel file di mapping XML?