2011-11-24 15 views
7

कहें कि मेरे पास एक इकाई MyEntity है, और इसमें फॉर्मूला-आधारित प्रॉपर्टी fmlaProp है। अब कहते हैं कि मैं एक मानदंड बनाने:हाइबरनेट - फ़ॉर्मूला प्रॉपर्टी द्वारा ऑर्डरिंग मानदंड

s.createCriteria(MyEntity.class) 
    .setProjection( 
     Projections.distinct( 
      Projections.property("fmlaProp"))) 
    .addOrder(Order.asc("fmlaProp")); 
इस मामले मैं निम्नलिखित एसक्यूएल पाने में

:

SELECT DISTINCT fmlaProp-sql FROM MY_ENTITY_TABLE ORDER BY fmlaProp-sql 

कौन सा ओरेकल कह रही है कि आदेश-अभिव्यक्ति है पर एक त्रुटि देता है गैर चयन किया। फिर मैंने निम्नलिखित मानदंडों की कोशिश की:

s.createCriteria(MyEntity.class) 
    .setProjection( 
     Projections.distinct(
      Projections.alias(
       Projections.property("fmlaProp"), 
       "alias1")) 
    .addOrder(Order.asc("alias1")); 

जो "उपनाम 1 द्वारा आदेश" उत्पन्न करता है जो ठीक काम करता है। लेकिन यह बदसूरत है - कोड को उन सूत्र गुणों के "पता" होना चाहिए, जो "एक बार लिखें" सिद्धांत का उल्लंघन करते हैं। उस पर कोई विचार या सुझाव? पहले ही, आपका बहुत धन्यवाद।

+1

'-sql' भाग क्या है? – cherouvim

उत्तर

1

यह हाइबरनेट से व्यवहार की उम्मीद है। इसे विशेष रूप से फ़ॉर्मूला संपत्ति के साथ नहीं करना है, लेकिन आप अनुमानित मूल्य के साथ ऑर्डर करना चाहते हैं। Hibernate Docs से:

उपनाम, प्रक्षेपण ताकि अनुमानित मूल्य प्रतिबंध या orderings में निर्दिष्ट किया जा सकता है को सौंपा जा सकता। यहाँ यह करने के लिए दो अलग अलग तरीकों ... हैं

जहाँ तक विकल्प, आप सूत्र संपत्ति एक आभासी स्तंभ (Oracle 11 और इसके बाद के संस्करण के संस्करणों में) बनाने या इस के साथ एक दृश्य में तालिका लपेटकर कोशिश कर सकते के रूप में कॉलम गणना की। इस तरह, ओरेकल सीधे fmlaprop पता चलेगा, जिसका उपयोग "सामान्य" कॉलम की तरह किया जा सकता है।

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