2009-09-28 10 views
5

साथ NHibernate मानदंड API का उपयोग करना मैं निम्नलिखित डोमेन NHibernate के साथ दृढ़ता के लिए स्थापित किया है: Domainडेटा के विशिष्ट सेट का चयन करने के लिए एक साथ एक गिनती

मैं जड़ कुल के रूप में PaperConfiguration उपयोग कर रहा हूँ।

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

ICriteria criteria = 
session.CreateCriteria<PaperConfiguration>() 
    .Add(Restrictions.Eq("AcademicYearConfiguration", configuration)) 
    .CreateCriteria("Paper") 
    .CreateCriteria("Unit") 
    .CreateCriteria("Tier") 
     .Add(Restrictions.Eq("Id", tier.Id)) 

return criteria.List<PaperConfiguration>(); 

(शायद इस हालांकि ऐसा करने का एक बेहतर तरीका है)।

फिर भी यह जानने की आवश्यकता है कि प्रत्येक पेपर कॉन्फ़िगरेशन के लिए कितने संदर्भ सामग्री हैं और मैं इसे उसी कॉल में प्राप्त करना चाहता हूं। एचक्यूएल से बचें - मेरे पास पहले से ही एक एचक्यूएल समाधान है।

मुझे पता है कि अनुमान क्या हैं और this question एक विचार सुझाता है लेकिन मैं इसे काम नहीं कर सकता।

मैं एक PaperConfigurationView है, बजाय IList<ReferenceMaterial> ReferenceMaterials ReferenceMaterialCount है और

ICriteria criteria = 
session.CreateCriteria<PaperConfiguration>() 
    .Add(Restrictions.Eq("AcademicYearConfiguration", configuration)) 
    .CreateCriteria("Paper") 
    .CreateCriteria("Unit") 
    .CreateCriteria("Tier") 
     .Add(Restrictions.Eq("Id", tier.Id)) 
    .SetProjection(
     Projections.ProjectionList() 
      .Add(Projections.Property("IsSelected"), "IsSelected") 
      .Add(Projections.Property("Paper"), "Paper") 
      // and so on for all relevant properties 
      .Add(Projections.Count("ReferenceMaterials"), "ReferenceMaterialCount") 
    .SetResultTransformer(Transformers.AliasToBean<PaperConfigurationView>()); 

return criteria.List<PaperConfigurationView>(); 

की तर्ज पर सोच रहा था दुर्भाग्य से यह काम नहीं करता। मैं क्या गलत कर रहा हूं?

निम्नलिखित सरलीकृत क्वेरी:

ICriteria criteria = 
session.CreateCriteria<PaperConfiguration>() 
.CreateCriteria("ReferenceMaterials") 
.SetProjection(
Projections.ProjectionList() 
.Add(Projections.Property("Id"), "Id") 
.Add(Projections.Count("ReferenceMaterials"), "ReferenceMaterialCount") 
).SetResultTransformer(Transformers.AliasToBean<PaperConfigurationView>()); 
return criteria.List<PaperConfigurationView>(); 

इस बल्कि अप्रत्याशित एसक्यूएल बनाता है:

SELECT 
    this_.Id as y0_, 
    count(this_.Id) as y1_ 
FROM Domain.PaperConfiguration this_ 
    inner join Domain.ReferenceMaterial referencem1_ 
    on this_.Id=referencem1_.PaperConfigurationId 

ऊपर क्वेरी ADO.NET त्रुटि के साथ विफल के रूप में यह स्पष्ट रूप से एक सही एसक्यूएल के बाद से यह याद आ रही है नहीं है एक समूह या गिनती गिनती (contextm1_.Id) की बजाय (this_.Id)।

NHibernate मैपिंग:

<class name="PaperConfiguration" table="PaperConfiguration"> 
    <id name="Id" type="Int32"> 
     <column name="Id" sql-type="int" not-null="true" unique="true" index="PK_PaperConfiguration"/> 
     <generator class="native" /> 
    </id> 
    <!-- IPersistent --> 
    <version name="VersionLock" /> 
    <!-- IAuditable --> 
    <property name="WhenCreated" type="DateTime" /> 
    <property name="CreatedBy" type="String" length="50" /> 
    <property name="WhenChanged" type="DateTime" /> 
    <property name="ChangedBy" type="String" length="50" /> 

    <property name="IsEmeEnabled" type="boolean" not-null="true" /> 

    <property name="IsSelected" type="boolean" not-null="true" /> 

    <many-to-one name="Paper" column="PaperId" class="Paper" not-null="true" access="field.camelcase"/> 

    <many-to-one name="AcademicYearConfiguration" column="AcademicYearConfigurationId" class="AcademicYearConfiguration" not-null="true" access="field.camelcase"/> 

    <bag name="ReferenceMaterials" generic="true" cascade="delete" lazy="true" inverse="true"> 
     <key column="PaperConfigurationId" not-null="true" /> 
     <one-to-many class="ReferenceMaterial" /> 
    </bag> 
    </class> 

    <class name="ReferenceMaterial" table="ReferenceMaterial"> 
    <id name="Id" type="Int32"> 
     <column name="Id" sql-type="int" not-null="true" unique="true" index="PK_ReferenceMaterial"/> 
     <generator class="native" /> 
    </id> 
    <!-- IPersistent --> 
    <version name="VersionLock" /> 
    <!-- IAuditable --> 
    <property name="WhenCreated" type="DateTime" /> 
    <property name="CreatedBy" type="String" length="50" /> 
    <property name="WhenChanged" type="DateTime" /> 
    <property name="ChangedBy" type="String" length="50" /> 

    <property name="Name" type="String" not-null="true" /> 
    <property name="ContentFile" type="String" not-null="false" /> 
    <property name="Position" type="int" not-null="false" /> 
    <property name="CommentaryName" type="String" not-null="false" /> 
    <property name="CommentarySubjectTask" type="String" not-null="false" /> 
    <property name="CommentaryPointScore" type="String" not-null="false" /> 
    <property name="CommentaryContentFile" type="String" not-null="false" /> 

    <many-to-one name="PaperConfiguration" column="PaperConfigurationId" class="PaperConfiguration" not-null="true"/> 
    </class> 
+0

दूसरी मानदंड क्वेरी क्यों काम नहीं करती है? कोई त्रुटि संदेश? (मुझे लगता है कि यह खंड द्वारा एक समूह को याद कर रहा है, लेकिन यह सुनिश्चित करना चाहते हैं कि आपको क्या सामना करना पड़ा।) –

+0

क्या आप कृपया अपनी मैपिंग पोस्ट कर सकते हैं? –

+0

मैं यह सुनिश्चित करने के लिए कल मैपिंग्स को शामिल करूंगा कि मैंने उन्हें पर्याप्त रूप से कब्जा कर लिया है। त्रुटि संदेश के बारे में - आप SQL क्वेरी से देख सकते हैं कि यह सही नहीं होगा - लेकिन इस बिंदु पर यह अप्रासंगिक प्रतीत होता है क्योंकि मैं एक उप-क्वेरी से गणना करने की अपेक्षा करता हूं लेकिन वहां कोई जॉइन या उप क्वेरी भी नहीं है। – mfloryan

उत्तर

1

आप Projections.GroupProperty (का उपयोग करना चाहिए) के बजाय Projections.Property की()।

+0

धन्यवाद। मैंने वास्तव में संपत्ति और समूहप्रोपर्टी दोनों की कोशिश करने के इस दृष्टिकोण के साथ प्रयोग किया है और न ही नतीजे परिणाम। – mfloryan

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