Grails 2.x createCriteria'或'不适用于嵌套关联 [英] Grails 2.x createCriteria 'or' doesn't work for nested associations

查看:130
本文介绍了Grails 2.x createCriteria'或'不适用于嵌套关联的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

看起来在Grails 2.x中,如果您有一个域类关联,并且您尝试在该关系+另一个查询上使用运行createCriteria,则将忽略另一个查询,并使用嵌套关联的结果。我知道这可能有点令人困惑,所以这里是一个例子:

  class Passenger {
Long id
Boolean isDriving
}

class Car {
Long id
Passenger passenger
Boolean isMoving

static constraints = {
乘客可空:true
}
}



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

汽车车1 =新车(乘客:乘客1,正在行驶:假)
汽车车2 =新车(isMoving: true)

car1.save()
car2.save()
$ b $ def queryResults = Car.createCriteria().list(){
或{
eq('isMoving',true)//这样做本身可以工作

passenger {//这本身可以工作
eq ('isDriving',true)
}
} //但OR'd,它只返回嵌套部分的结果
}

assertEquals 2,queryResults .size()//返回1
}
}

在旧版本的Grails中工作,但似乎现在不工作 - 有谁知道一个很好的解决方法,除了运行多个查询吗?

解决方案 更新:

Post Grails 2.x,Criteria默认使用 inner join ,但是对于这种特殊情况 outer 加入必须被使用,因为乘客联合不允许遵循条件是内部加入并且乘客未设置为汽车。

  import org.hibernate.Criteria 
$ b $ def queryResults = Car.createCriteria()。list(){
createAlias('passenger','passenger',Criteria.LEFT_JOIN)
或{
eq('isMoving',true)
eq('passenger.isDriving',true)
}
}


It seems that in Grails 2.x, if you have a domain class association, and you try to run a createCriteria using or on that relation + another query, the or will ignore the other query and just use the results of the nested association. I realize this may be a little confusing, so here is an example:

class Passenger {
    Long id
    Boolean isDriving
}

class Car {
    Long id
    Passenger passenger
    Boolean isMoving

    static constraints = {
        passenger nullable: true
    }
}

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

This same code worked in older versions of Grails, but doesn't not seem to work now -- does anyone know of a good workaround to this, other than running multiple queries?

解决方案

UPDATE:
Post Grails 2.x, Criteria by default uses inner join, but for this particular case outer join has to be used as passenger association will not allow to follow or condition if it is an inner join and passenger is not set to car.

import org.hibernate.Criteria

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

这篇关于Grails 2.x createCriteria'或'不适用于嵌套关联的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆