2011-04-24 19 views
8

मुझे Grails में प्रक्षेपण के साथ कुछ समस्याएं हैं। क्या आप कृपया मेरी समीक्षा करने में मदद कर सकते हैं और मेरे लिए समाधान सुझा सकते हैं?Grails: कई तालिकाओं पर प्रक्षेपण?

  1. मैं जो कई-से-एक संबंध और उन दोनों के बारे में कुछ गुणों पर प्रक्षेपण है कई टेबल पर डेटा क्वेरी करना चाहते हैं। उदाहरण के लिए:

    class Person { 
        int id 
        String name 
        String address 
        static hasMany = [cars : Car] 
    } 
    
    class Car { 
        int id 
        String brand 
        long price 
        Person owner 
        static belongsTo = [owner : Person] 
    } 
    

    तो, मैं तो बस एक क्वेरी withCriteria (लागू प्रक्षेपण) एक निर्दिष्ट कार (ब्रांड, मूल्य, और मालिक का नाम शामिल हैं) के बारे में जानकारी प्राप्त करने के लिए उपयोग कर सकते हैं?

    Car.withCriteria { 
        projections { 
         property("brand") 
         property("price") 
         property("owner.name") 
        } 
        eq("id", carId) 
    } 
    
  2. मैं एक प्रक्षेपण का उपयोग कर सकते उसकी सभी कारों के नाम के साथ एक निर्दिष्ट व्यक्ति की जानकारी पाने के लिए: इसका इस्तेमाल करना संभव है? उदाहरण के लिए: [01, पटर, 01 स्ट्रीट ए, [मर्सिडीज, टोयोटा, डुकाट्टी]]?

  3. एक विशेष स्थिति: (ऊपर व्यक्ति वर्ग के साथ)
    एक व्यक्ति को कई संगठन शामिल हो सकते हैं, और एक संगठन एक "जनक" संगठन हो सकता है (और इसके विपरीत, एक संगठन कई अन्य निर्भर संगठनों हो सकते हैं)। लेकिन एक नियम है: एक व्यक्ति सिर्फ किसी दिए गए संगठन के केवल एक बच्चे संगठन में शामिल हो सकता है। तो किसी दिए गए संगठन ओ और एक व्यक्ति पी के साथ, ओ के प्रतिनिधि संगठन के नाम के साथ पी की जानकारी प्राप्त करने का सबसे तेज़ तरीका क्या है जिसमें पी सदस्य है। मैं Grails प्रक्षेपण का उपयोग करना पसंद करते हैं।

    class Person { 
        int id 
        String name 
        String address 
        static hasMany = [joinedOrgs : Organization] 
    } 
    
    class Organization { 
        int id 
        String name 
        Organization parentOrg 
        static hasMany = [members : Person, childOrgs : Organization] 
    } 
    

मैं Grails के साथ एक नौसिखिया हूँ, और मैं GORM और अधिक समझने के लिए करना चाहते हैं:

यहाँ डेटा मॉडल है। आपकी मदद के लिए बहुत बहुत धन्यवाद।

उत्तर

1

(1) और (2) के लिए, मुझे नहीं पता कि क्या आप केवल 1 मानदंड क्वेरी के साथ जो चाहते हैं उसे करने का कोई तरीका है, लेकिन वैकल्पिक तरीका बस अधिक सरल और प्राकृतिक प्रतीत होता है। (1) के लिए:

def car = Car.get(carId) 
def owners = car.owner?.name 

के लिए (2)

def person = Person.get(personId) 
def cars = person.cars*.name 

बारे में (3), इसे यहाँ डिजाइन समस्या की तरह है। आपका वर्तमान डोमेन डिज़ाइन आपके द्वारा वर्णित नियम को प्रतिबिंबित नहीं करता है, इसलिए उस बाधा को बनाए रखना मुश्किल होगा। आप एक व्यक्ति संगठन वर्गीकरण तालिका और make childrenOrganization a transient property मैपिंग पर विचार कर सकते हैं। उदाहरण के लिए:

class Organization { 
    int id 
    String name 
    Organization parent 
    static transients = ['children'] 
    ... 

    Boolean children() { 
     def children = Organization.createCriteria().list() { 
      eq ('parent', this) 
     } 
     return children 
    } 
} 

उसके बाद, आप एक संगठन के सभी अभिभावक पदानुक्रम, व्यक्ति-संगठन की सूची में देखो यह निर्धारित करने के लिए getAllAncestors की तरह एक निशान-बैक समारोह() का उपयोग कर सकते हैं। ऐसा लगता है कि यह सबसे अच्छा तरीका नहीं है, लेकिन यह एक संभावित तरीका है।

3

के लिए (नं1) मुझे लगता है कि आप के लिए यहाँ

http://grails.1312388.n4.nabble.com/grails-reports-page-multiple-domain-criteria-join-td3510604.html

def criteria = Company.createCriteria() 
    def results = criteria.list { 
     projections { 
       property('id', 'company.id') 
       ... 
       POCs{ 
         property('id', 'poc.id') 
         property('name', 'poc.name') 
       } 
       software { 
         productKey { 
           ... 
           } 
       } 
       ... 
       order(company.name,'asc') 
     } 

का उपयोग कर .createCriteria()

10

इस

def results = Car.createCriteria().list() { 
    createAlias('owner','owner') 
    projections { 
     property('owner.name', 'owner.name') 
     property('brand','brand') 
     property('price','price') 
    } 
} 
+0

क्यों 'alias' जरूरत थी प्रयास करें पोस्ट पर प्रकाश डाला समझाया गया है जो खोज रहे हैं? –

+0

@AlexanderSuraphel उपनाम के बिना आप सीधे 'संपत्ति ('owner.name', 'owner.name')' में 'owner.name' तक नहीं पहुंच सकते हैं, यहां तक ​​कि आप उपनाम के बिना परिणाम प्राप्त कर सकते हैं लेकिन आपको इसके लिए और कोड लिखना होगा । 'उदाहरण नीचे अनुमानों देखें { मालिक { संपत्ति ('नाम', 'नाम') } संपत्ति ('ब्रांड', 'ब्रांड') संपत्ति ('मूल्य', 'कीमत') }' कृपया अगर आपको अभी भी कोई भ्रम है, तो मुझे बताएं, या यह आपके लिए सही जवाब नहीं था। धन्यवाद –

+0

@AlexanderSuraphel यदि आप 'createAlias ​​(' owner ',' owner ') के बिना उपरोक्त कोड लिख सकते हैं, तो यह संभव है कि यह संभव है कि grails –

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