2013-10-15 10 views
5

Görünüşe göre, Grails 2.x'te bir etki alanı sınıfı ilişkilendirmeniz varsa ve bu ilişkide or'u kullanarak başka bir sorguyu çalıştırmayı deneyin. or, diğer sorguyu yok sayar ve yalnızca iç içe geçmiş ilişkilendirmenin sonuçlarını kullanır.Grails 2.x createCriteria 'veya' iç içe geçmiş ilişkilendirmeler için çalışmaz

class Passenger { 
    Long id 
    Boolean isDriving 
} 

class Car { 
    Long id 
    Passenger passenger 
    Boolean isMoving 

    static constraints = { 
     passenger nullable: true 
    } 
} 

ve bir test:

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 
    } 
} 

Bu aynı kod Grails eski sürümlerinde çalıştı, ancak görünmüyor gelmez bu nedenle burada bir örnek, bu biraz kafa karıştırıcı olabilir fark şimdi çalış - birden çok sorgu çalıştırmanın dışında herkes bunun için iyi bir çözümden haberi var mı?

+0

Hazırda bekletme günlüğünü açmayı ve hangi sql üretildiğini görün. Çevrenizde bir hql sorgusu yazabilirsiniz ancak –

+0

@JimSosa'ya sahip olmamanız gerekir. HQL kullanmamayı umuyordum ama evet zorundayım. – Igor

cevap

10

GÜNCELLEME:
Mesaj Grails 2.x, varsayılan kullanımları inner katılmak tarafından Kriterleri ancak outer bir inner katılmak ise or durumunu takip etmesine izin vermez yolcu dernek olarak kullanılmalıdır katılmak Bu özel durumla ve yolcu arabaya ayarlanmamış.

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 Güncelleme bölümüne göz atın. Dış birleştirmenin kullanılması gerekir. – dmahapatro

+0

Not 3/hibernate 4+ notlarına göre, Kriterler kullanımdan kaldırılmış ve JoinType.LEFT_OUTER_JOIN yerine, ancak başka bir şekilde mükemmel bir cevap olmalıdır. – Trebla

İlgili konular