2009-11-05 4 views
8

मैं एक बाईं जोड़ने टास्क मेज पर शामिल करना चाहते हैं जब निम्न स्थिति उत्पन्न होती है: वाम पर लाने PROMPT पी JOIN (t.id = p.task.id औरहाइबरनेट HQL: कैसे एक जटिल बाईं उपयोग करने के लिए शामिल होने के लाने

select 
      distinct t   
     from 
      TASK t 
     LEFT JOIN FETCH 
      SERVER ser 
       on t.id=ser.task_id 
     LEFT JOIN FETCH 
      APPLICATION app 
       on ser.id=app.server_id   
     LEFT JOIN FETCH 
      PROMPT p on (t.id = p.task.id and p.applicationName in ('XXX')) 
     where 
      t.id=ser.task.id 
      and ser.id=app.server 
      and app.name in ('XXX') 
     order by t.id 

मैं कीवर्ड "पर" शायद की वजह से निम्न अपवाद मिलता है,:

java.lang.NoSuchMethodError: org.hibernate.hql.antlr.HqlBaseParser.recover(Lantlr/RecognitionException;Lantlr/collections/impl/BitSet;)V 

     at org.hibernate.hql.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:771) 
01 ('XXX') में p.applicationName
)

यहाँ मेरी HQL क्वेरी है

कोई विचार?

class Task { 
    private String taskId; 
    private Set<ServerDetails> servers; 
} 

class ServerDetails { 
    private String id; 
    private Set<ApplicationDetails> applications; 
} 

class ApplicationDetails { 
    private String id; 
} 

    Class Prompt { 
     private String applicationName; 
    } 

मैं बाईं कैसे उपयोग कर सकते हैं शामिल होने के ('XXX') में मेरी हालत p.applicationName का उपयोग कर लाने?

+0

आपके द्वारा पोस्ट की गई क्लास स्ट्रक्चर (मुझे लगता है कि उन सभी गुणों पर उपयुक्त एनोटेशन हैं) किसी भी अन्य वर्ग में 'प्रॉम्प्ट 'लिंक नहीं करता है। आप एसक्यूएल 'task_id' के माध्यम से 'प्रॉम्प्ट' और 'टास्क' में शामिल होते हैं लेकिन ऊपर कोई मिलान गुण नहीं हैं। 'प्रॉम्प्ट 'पर एक संपत्ति' टास्क' है? या ठीक इसके विपरीत? क्या आप स्पष्ट कर सकते हो? – ChssPly76

उत्तर

23

वहाँ कई समस्याओं यहां हैं:

  1. आपका HQL के रूप में आप यह पोस्ट किया है :-) यह सीधे एसक्यूएल हो रहा है वास्तव में नहीं HQL है। एचक्यूएल के लिए आपको टेबल में शामिल होने के लिए मैप किए गए एसोसिएशन का उपयोग करने की आवश्यकता है। एक बेहतर संस्करण के लिए नीचे देखें।
  2. जहां तक ​​मुझे पता है ON खंड ब्रांड्स में एकाधिक जुड़ी स्थितियों का समर्थन नहीं करता है।
  3. NoSuchMethodError कुछ ऐसा नहीं है जो हाइबरनेट फेंक देगा :-) आपके पास शायद आपके क्लासपाथ में antlr.jar का पुराना संस्करण है और इसे हाइबरनेट द्वारा अपेक्षित व्यक्ति के स्थान पर उठाया जाता है। इसे ढूंढें और इसे हटा दें।

निम्नलिखित अपने मैपिंग देखकर बिना संभावना गलत है, लेकिन मैं और अधिक उपयुक्त HQL लेखन पर एक चाकू ले लेंगे:

select distinct t   
    from TASK t 
    left join fetch t.server ser 
    left join fetch ser.application app 
    left join t.prompt p with p.applicationName in ('XXX') 
order by t.id 

ध्यान दें कि prompt लाया जा सका क्योंकि आप join fetch उपयोग नहीं कर सकते नहीं है with स्थिति के साथ। एसोसिएशन की आवश्यकता होने पर आप inner join fetch और where के साथ इसे प्रतिस्थापित कर सकते हैं।

यदि आपको क्लासपाथ समस्या हल होने के बाद भी समस्या हो रही है, तो आपको वास्तविक मैक्यूएल के साथ मदद की ज़रूरत है, तो अपने मैपिंग पोस्ट करने के लिए स्वतंत्र महसूस करें।

+0

@ ChssPly76: मुझे आश्चर्य है कि आप हाइबरनेट के अंदरूनी हिस्सों को कितनी अच्छी तरह जानते हैं, मुझे लगता है कि आप या तो शुरुआत से ही इसके साथ काम कर रहे होंगे या आप वास्तव में परियोजना या दोनों कोड कोड कर सकते हैं - या तो जिस तरह से आप यहां रोशनी के लिए महान हैं कोडर जनता। –

+1

अब, आप गेविन ईर्ष्या बना देंगे। मैं निश्चित रूप से मजाक कर रहा हूँ :-) - धन्यवाद। – ChssPly76

+0

आपके उत्तर के लिए धन्यवाद लेकिन मुझे अभी भी शीघ्रता लाने की आवश्यकता है। मैं अपनी स्थिति p.applicationName ('XXX') में बाएं शामिल ** fetch ** का उपयोग कैसे कर सकता हूं? – Keren

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