2013-10-15 5 views
5

ऐसा लगता है कि Grails 2.x में, यदि आपके पास डोमेन क्लास एसोसिएशन है, और आप उस संबंध पर or का उपयोग करके CreateCriteria चलाने का प्रयास करते हैं तो कोई अन्य प्रश्न , or अन्य क्वेरी को अनदेखा कर देगा और केवल नेस्टेड एसोसिएशन के परिणामों का उपयोग करेगा। मुझे पता है यह एक छोटे से भ्रमित हो सकता है, इसलिए यहाँ एक उदाहरण है:Grails 2.x createCriteria 'या' नेस्टेड एसोसिएशन के लिए काम नहीं करता है

class Passenger { 
    Long id 
    Boolean isDriving 
} 

class Car { 
    Long id 
    Passenger passenger 
    Boolean isMoving 

    static constraints = { 
     passenger nullable: true 
    } 
} 

और एक परीक्षण:

class CarIntegrationTests { 
    @Test 
    void testCar() { 
    Passenger passenger1 = new Passenger(isDriving: true) 
    passenger1.save() 

    Car car1 = new Car(passenger: passenger1, isMoving: false) 
    Car car2 = new Car(isMoving: true) 

    car1.save() 
    car2.save() 

     def queryResults = Car.createCriteria().list() { 
      or { 
       eq('isMoving', true)// This by itself works 

       passenger {// And this by itself works 
        eq('isDriving', true) 
       } 
      }// But OR'd, it only returns the results of the nested part 
     } 

     assertEquals 2, queryResults.size() // Returns 1 
    } 
} 

यह वही कोड Grails के पुराने संस्करणों में काम किया, लेकिन करने के लिए नहीं प्रतीत नहीं होता अब काम करें - क्या किसी को भी कई प्रश्नों को चलाने के अलावा, इसके लिए एक अच्छा कामकाज पता है?

+0

हाइबरनेट लॉगिंग चालू करने का प्रयास करें और देखें कि एसक्यूएल क्या उत्पन्न किया जा रहा है। एक काम के आसपास आप केवल एक एचक्यूएल क्वेरी लिख सकते हैं, लेकिन आपको –

+0

@JimSosa हाँ नहीं होना चाहिए, मैं इसे लॉगिंग के साथ आज़माउंगा। मैं उम्मीद कर रहा था कि एचक्यूएल का उपयोग न करें, लेकिन हाँ, मुझे करना पड़ सकता है। – Igor

उत्तर

10

अद्यतन:
पोस्ट Grails 2.x, डिफ़ॉल्ट का उपयोग करता है inner में शामिल होने के द्वारा मानदंड है, लेकिन इस विशेष मामले outer में शामिल होने अगर यह एक inner में शामिल होने है यात्री संघ के रूप में प्रयोग की जाने वाली or हालत पालन करने के लिए अनुमति नहीं दी जाएगी है के लिए और यात्री कार पर सेट नहीं है।

import org.hibernate.Criteria 

def queryResults = Car.createCriteria().list() { 
    createAlias('passenger', 'passenger', Criteria.LEFT_JOIN) 
    or { 
     eq('isMoving', true) 
     eq('passenger.isDriving', true) 
    } 
} 
+0

@GrailsGuy मेरा अपडेट देखें। बाहरी जुड़ाव का उपयोग किया जाना चाहिए। – dmahapatro

+0

Grails 3/हाइबरनेट 4+ द्वारा नोट, मानदंड को बहिष्कृत किया गया है और इसके बजाय JoinType.LEFT_OUTER_JOIN होना चाहिए, लेकिन अन्यथा अभी भी एक सही उत्तर है। – Trebla

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