2010-08-15 18 views
6

que estoy tratando de hacer un LEFT JOIN en Hibernate Query Language, en MySQL que puedo hacer esto de la siguiente manera:LEFT JOIN en Hibernate Query Language

seleccionar * de day_timetable_timeslots t LEFT JOIN golfnine_date_time_entity d EN d.start_time = t.start_time

En mis day_timetable_timeslots la tabla I tiene muchos intervalos de tiempo para todo el día con incrementos de 15 minutos. p.ej. 00:00:00, 00:15:00, 00:30:00, ... hasta el final del día. Así que me muestra todos los intervalos de tiempo con cualquier coincidencia golf_ine_date_time_entity, pero parece que no puedo averiguar cómo hacerlo en Hibernate Query Language.

Bueno, puedo hacer la UNIÓN IZQUIERDA mediante el siguiente HQL.

seleccione o.id, book.id de DayTimetableTimeslots o externa izquierda libro o.bookings donde o.id> 0

No sé por qué tengo que poner el o.id> 0 allí, pero funciona.

Sin embargo, solo quiero seleccionar book.id donde la reserva tiene una condición where. me trataron:

seleccione o.id, book.id de DayTimetableTimeslots o externa izquierda libro o.bookings donde o.id> 0 y book.dateTime.startDate> '2010-01-01'

Pero esto no funciona correctamente, solo muestra algunas de las tablas de tiempo de DayTimetable, pero no todas, como se supone que debe hacerlo.

Básicamente quiero hacer esta consulta mysql en HQL.

seleccione t.id como start_time_sequence, t.start_time como all_start_time, d. * Desde day_timetable_timeslots t LEFT JOIN golfnine_date_time_entity d = EN d.start_time t.start_time Y t.customer_id = d.customer_id Y d.start_date = '2010 -01-24' DONDE t.customer_id = 11

Gracias, Felipe


en MySQL que puede hacer lo siguiente y que me muestra todas las reservas en contra de su hora de inicio. Todas las horas de inicio se almacenan en day_timetable_timeslots.

seleccione t.start_time, d.id de day_timetable_timeslots t combinación izquierda golfnine_date_time_entity d = EN 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' 

... para todo el día, que coincide con los ID de la golfnine_date_time_entity con los tiempos en day_timetable_timeslots.

Lo bueno de esta consulta de mysql es que puedo establecer algunos criterios sobre la reserva, por ej.

seleccione t.id, t.start_time, d.id de day_timetable_timeslots t UNEN LEFT golfnine_date_time_entity d EN d.start_time = t.start_time Y t.customer_id = d.customer_id Y d.start_date = '2010-01-24 ' Donde T.customer_id = 11

consigo

... 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 

Por lo que su única muestra la reserva en esa fecha especificada y el ID de cliente.

Es tan difícil de hacer esto en HQL ...


Ésta es la unión que quiero en HQL.

seleccione o.id, b.id de DayTimetableTimeslots O, LegacyDateTimeEntity b donde b.customer.id = 11 y b.startDate = '2010-02-07' y o.startTime = b.startTime

Da este 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 

Pero - sólo devuelve 1 fila porque sólo una golfnine_date_time_entity coincide, quiero que todos los day_timetable_timeslots filas devueltas.

Así que probé en HQL.

seleccione o.id, o.bookings.size de DayTimetableTimeslots o left join o.bookings reserve left join book.dateTime dt con dt.customer.id = 11 y dt.startDate = '2010-02-29' donde 1 = 1

Lo que lamentablemente parece ignorar la expresión con.

Devuelve este 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 

Lo cual se une a todas las relaciones de concordancia entre las tablas e ignora legacydate2_.customer_id = 11 y legacydate2_.start_date = '29/02/2010'


encontré que esto parece funcionar . Tenga en cuenta que estoy haciendo referencia a dt2 que está en la cláusula con.

seleccionar o.startTime distinta, dt2.id, book.uniqueDateTimeResource de DayTimetableTimeslots o unirse a izquierda libro o.bookings con book.deleted = 0 dejaron unirse a book.dateTime DT2 con dt2.startDate = '2010-01-19' y dt2.deleted = 0

+0

¿Puede mostrar el SQL generado por su HQL, y algunos datos de muestra con la salida resultante y la salida deseada? – RMorrisey

+0

gracias, agregué más comentarios a mi pregunta. – Phil

Respuesta

1

puedo pensar en dos posibles problemas que se están ejecutando en:

  1. usted está teniendo problemas con la precisión de la fecha/hora entre el java y el código SQL. Puede intentar ajustar la fecha con un pequeño incremento y ver si aparecen los valores correctos.

  2. Su asignación de hibernación no es correcta. Parece que siempre se unen en varias columnas? Tu esquema es un poco confuso para mí. ¿Utiliza la anotación @JoinColumns para especificar varias columnas en su asociación (si está usando anotaciones), o su equivalente en el archivo de mapeo XML?