我正在尝试在Hibernate查询语言中进行LEFT JOIN,在MySQL中我可以这样做:
select * from day_timetable_timeslots t 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:00:00,...到一天结束。 所以它显示了所有匹配的golfnine_date_time_entity的时间间隔,但我似乎无法弄清楚如何在Hibernate查询语言中做到这一点。
我可以通过以下HQL进行LEFT JOIN。
从DayTimetableTimeslots o left outer join o.bookings book中选择o.id,book.id,其中o.id> 0
我不知道为什么我必须把o.id> 0那里,但它的工作原理。
但是,我想只选择book.id的预订有条件的地方。 我试过了:
从DayTimetableTimeslots o left outer join o.bookings book中选择o.id,book.id,其中o.id> 0和book.dateTime.startDate> '2010-01-01'
但是这不能正常工作,它只显示了一些DayTimetableTimeslots,但不是全部,因为它应该这样做。
我基本上想在HQL中执行这个mysql查询。
选择t.id作为start_time_sequence,t.start_time作为all_start_time,d。*来自day_timetable_timeslots 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' 在哪里t.customer_id = 11
谢谢,菲利普
在mysql中,我可以执行以下操作,它会向我显示所有与其开始时间相关的预订。所有开始时间都存储在day_timetable_timeslots中。
选择t.start_time,d.id from 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'
...整天,它将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'在哪里t.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连接。
从DayTimetableTimeslots o,LegacyDateTimeEntity b中选择o.id,b.id,其中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
但是 - 它只返回1行,因为只有一个golfnine_date_time_entity匹配,我想要返回所有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'其中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-02-29'
我发现这似乎有效。注意我引用了with子句中的dt2。
从DayTimetableTimeslots中选择不同的o.startTime,dt2.id,book.uniqueDateTimeResource o left join o.bookings book with book.deleted = 0 left join book.dateTime dt2 with dt2.startDate ='2010-01-19'and dt2.deleted = 0
答案 0 :(得分:1)
我可以想到你遇到的两个潜在问题:
您的java和SQL代码之间存在日期/时间精度问题。您可以尝试按小幅增量调整日期,并查看是否显示正确的值。
您的hibernate映射不正确。看起来你总是加入多个列?你的架构对我来说有点混乱。您是否使用@JoinColumns批注指定关联中的多个列(如果您正在使用注释),或XML映射文件中的等效项?