2010-08-15 31 views
6

मैं एक वाम करने के लिए कोशिश कर रहा हूँ में हाइबरनेट क्वेरी लैंग्वेज में शामिल हों, MySQL में मैं इस प्रकार कर सकते हैं:बायाँ में हाइबरनेट क्वेरी लैंग्वेज शामिल हों

चयन * day_timetable_timeslots से टी वाम d.start_time पर golfnine_date_time_entity घ में शामिल हों = t.start_time

मेरी तालिका में day_timetable_timeslots मेरे पूरे दिन 15 मिनट की वृद्धि के साथ कई बार अंतराल होता है। जैसे। 00:00:00, 00:15:00, 00:30:00, ... दिन के अंत तक। तो यह मुझे किसी भी मिलान करने वाले golfnine_date_time_entity के साथ हर समय अंतराल दिखाता है, लेकिन मैं यह नहीं समझ सकता कि हाइबरनेट क्वेरी भाषा में इसे कैसे किया जाए।

वैसे मैं निम्नलिखित एचक्यूएल द्वारा बाएं जॉइन कर सकता हूं।

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'

लेकिन यह सही ढंग से काम नहीं करता है, यह केवल कुछ दिन टिमेटेबल टाइम्सलॉट दिखाता है, लेकिन उनमें से सभी नहीं, जैसा कि ऐसा करना है।

मैं मूल रूप से एचक्यूएल में यह mysql क्वेरी करना चाहता हूं।

day_timetable_timeslots से start_time_sequence, all_start_time रूप t.start_time, डी के रूप में t.id का चयन करें। * टी बाईं तरफ d.start_time = t.start_time और t.customer_id = d.customer_id और d.start_date = 2010 golfnine_date_time_entity घ में शामिल हों -01-24 ' कहां t.customer_id = 11

धन्यवाद, फिलिप


mysql में मैं निम्नलिखित और यह मेरे अपने प्रारंभ समय के खिलाफ सभी बुकिंग चलता कर सकते हैं। सभी प्रारंभ समय day_timetable_timeslots में संग्रहीत होते हैं।

चयन t.start_time, d.id day_timetable_timeslots टी से छोड़ दिया golfnine_date_time_entity घ शामिल हों 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 की आईडी ऊपर से मेल खाता है day_timetable_timeslots में समय के साथ।

इस mysql क्वेरी के बारे में अच्छी बात यह है कि मैं बुकिंग पर कुछ मानदंड निर्धारित कर सकता हूं, उदाहरण के लिए।

चयन t.id, t.start_time, day_timetable_timeslots टी से d.id बायाँ शामिल हों golfnine_date_time_entity डी पर d.start_time = t.start_time और t.customer_id = d.customer_id और 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 

मिलता तो इसके केवल उस तिथि निर्दिष्ट और ग्राहक आईडी पर बुकिंग दिखा।

इसका इतना HQL में यह करने के लिए कठिन ...


इस में शामिल होने मैं HQL में चाहते हैं।

o.id का चयन करें, b.id DayTimetableTimeslots से ओ, LegacyDateTimeEntity ख जहां b.customer.id = 11 और b.startDate = '2010-02-07' और o.startTime = b.startTime

यह एसक्यूएल देता है।

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 पंक्तियों लौटे के सभी चाहते हैं।

तो मैंने एचक्यूएल में कोशिश की।

ओआईआईडी, ओ.बुकिंग्सइज़ का चयन करें डे टिमेटेबल टाइम्सलॉट्स से ओ ओ। बुकिंग्स में शामिल हों obookings book dt.customer.id = 11 और dt.startDate = '2010-02-29' के साथ book.dateTime dt में शामिल हों। 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'


मैंने पाया कि यह काम करने लगता है । नोट मैं डीटी 2 का संदर्भ दे रहा हूं जो खंड के साथ है।

विशिष्ट o.startTime, dt2.id, book.uniqueDateTimeResource का चयन करें DayTimetableTimeslots से o obookings पुस्तक में शामिल हो गए। Book.deleted = 0 dt2.startDate = '2010-01-19' के साथ book.dateTime dt2 में शामिल हो गए और dt2.deleted = 0

+0

क्या आप अपने एचक्यूएल द्वारा उत्पन्न एसक्यूएल दिखा सकते हैं, और आउटपुट के साथ कुछ नमूना डेटा परिणाम और वांछित आउटपुट? – RMorrisey

+0

धन्यवाद, मैंने अपने प्रश्न पर और टिप्पणियां जोड़ दीं। – Phil

उत्तर

1

मैं दो संभावित समस्याओं है कि आप चल रहे हैं के बारे में सोच सकते हैं:

  1. आप अपने जावा और SQL कोड के बीच दिनांक/समय परिशुद्धता के साथ मुद्दों कर रहे हैं। आप दिनांक को एक छोटी वृद्धि से समायोजित करने का प्रयास कर सकते हैं, और देख सकते हैं कि सही मान दिखाए गए हैं या नहीं।

  2. आपका हाइबरनेट मैपिंग सही नहीं है। ऐसा लगता है कि आप हमेशा कई कॉलम पर शामिल होते हैं? आपकी स्कीमा मेरे लिए थोड़ा उलझन में है। क्या आप अपने एसोसिएशन में एकाधिक कॉलम निर्दिष्ट करने के लिए @JoinColumns एनोटेशन का उपयोग करते हैं (यदि आप एनोटेशन का उपयोग कर रहे हैं), या एक्सएमएल मैपिंग फ़ाइल के समकक्ष?

संबंधित मुद्दे