2010-12-17 7 views
7

एक ईएवी सिस्टम में, मेरे पास ऐसा मैपिंग है जो इस तरह दिखता है:NHibernate HQL: "साथ" खंड के साथ बाहरी बहिष्कार काम नहीं करता है

<class name="Record"> 
    <map name="Values" table="RecordFieldValue"> 
     <key column="RecordFK"> 
     <index column="FieldFK"> 
     <element column="Value"> 
    </map> 
</class> 

मैं कुछ रिकॉर्ड्स का चयन करना चाहता हूं, जो एक विशिष्ट फ़ील्ड के लिए प्रत्येक रिकॉर्ड के मान द्वारा क्रमबद्ध है। हालांकि, ध्यान दें कि सभी रिकॉर्ड्स में वास्तव में उस फ़ील्ड का मूल्य नहीं होगा। इस मामले में, रिकॉर्ड अभी भी एक शून्य मूल्य के साथ लाया जाना चाहिए और क्रमबद्ध किया जाना चाहिए।

वांछित एसक्यूएल इस तरह दिखेगा:

select rec.*, val.Value 
from Record rec 
left outer join RecordFieldValue val 
on val.RecordFK = rec.PK and val.FieldFK = :field 
order by val.Value 

बहुत खुदाई के बाद, मैंने पाया कि बाएं के "चालू" खंड को संशोधित करने का सही तरीका एचक्यूएल में शामिल है "साथ" कीवर्ड (https://nhibernate.jira.com/browse/NH-514 देखें)। तो मैंने इस एचक्यूएल की कोशिश की:

from Record rec 
left join rec.Values vals with index(vals) = :field 
order by vals 

दुर्भाग्य से, यह निम्न त्रुटि उत्पन्न करता है: के साथ क्लॉज एक्सप्रेशन से क्लॉज तत्व से संदर्भ नहीं दिया गया था जिसके साथ क्लॉज से जुड़ा था। इसलिए मैंने इसके बजाय कोशिश की:

from Record rec 
left join rec.Values vals with index(rec.Values) = :field 
order by vals 

लेकिन इससे एक नई त्रुटि उत्पन्न हुई: खंड के साथ केवल ड्राइविंग तालिका में कॉलम का संदर्भ दे सकता है।

इस काम को कैसे प्राप्त करें इस पर कोई विचार? धन्यवाद।

- ब्रायन

उत्तर

9

यह काम करता है:

from Record rec 
left join rec.Values vals with vals.index = :field 
order by vals 

बिल्कुल सहज ज्ञान युक्त या नहीं अच्छी तरह से प्रलेखित है, लेकिन यह काम किया जाता है।

+0

क्या यह वही बात मानदंडों के साथ की जा सकती है? –

+0

सुंदर। मेरी इच्छा है कि इस जेपीए ने प्रतिबंध प्रश्न में शामिल छोड़ा था बेहतर जाना जाता था! मैं समय का एक गुच्छा बर्बाद कर दिया। –

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