Hibernate GORM生成的看似随机的1=1 where子句';什么地方关门

Hibernate GORM生成的看似随机的1=1 where子句';什么地方关门,hibernate,grails,gorm,Hibernate,Grails,Gorm,有问题的示例程序: 有问题的GORM代码 问题摘要 生成的SQL查询偶尔会生成一个where子句,其中包含1=1,而我希望在(?)中看到teams\u alia1\u.id 问题的详细描述 我编写了两个集成测试来说明这个问题: 请参见src/intrgeration test/groovy/ExampleITSpec.groovy 集成测试1 总是生成SQL select count(*) as y0_ from user_data this_ inner join status status

有问题的示例程序:

有问题的GORM代码 问题摘要 生成的SQL查询偶尔会生成一个where子句,其中包含1=1,而我希望在(?)中看到teams\u alia1\u.id

问题的详细描述 我编写了两个集成测试来说明这个问题:

请参见src/intrgeration test/groovy/ExampleITSpec.groovy 集成测试1 总是生成SQL

select count(*) as y0_ 
from user_data this_ inner join status status_ali2_ 
     on this_.status_id=status_ali2_.id 
     inner join workflow_role_teams teams5_ 
     on this_.id=teams5_.user_data_teams_id 
     inner join role teams_alia1_ 
     on teams5_.role_id=teams_alia1_.id 
where 
(((teams_alia1_.id in (?)) and (status_ali2_.is_open=?)) 
or 
(this_.owner_id=? and (status_ali2_.is_open=?))) limit ?
select count(*) as y0_ 
from user_data this_ inner join status status_ali2_ 
    on this_.status_id=status_ali2_.id 
    inner join workflow_role_teams teams5_ 
    on this_.id=teams5_.user_data_teams_id 
    inner join role teams_alia1_ 
    on teams5_.role_id=teams_alia1_.id 
where 
((1=1 and (status_ali2_.is_open=?)) 
or 
(this_.owner_id=? and (status_ali2_.is_open=?))) limit ?
集成测试2 偶尔会生成SQL

select count(*) as y0_ 
from user_data this_ inner join status status_ali2_ 
     on this_.status_id=status_ali2_.id 
     inner join workflow_role_teams teams5_ 
     on this_.id=teams5_.user_data_teams_id 
     inner join role teams_alia1_ 
     on teams5_.role_id=teams_alia1_.id 
where 
(((teams_alia1_.id in (?)) and (status_ali2_.is_open=?)) 
or 
(this_.owner_id=? and (status_ali2_.is_open=?))) limit ?
select count(*) as y0_ 
from user_data this_ inner join status status_ali2_ 
    on this_.status_id=status_ali2_.id 
    inner join workflow_role_teams teams5_ 
    on this_.id=teams5_.user_data_teams_id 
    inner join role teams_alia1_ 
    on teams5_.role_id=teams_alia1_.id 
where 
((1=1 and (status_ali2_.is_open=?)) 
or 
(this_.owner_id=? and (status_ali2_.is_open=?))) limit ?
1=1从何而来?

示例服务

def getMyOrMyTeamsData(User me) {
    // To fix the test Toggle these two lines
    def user = me
//        def user = User.get(me.id)

    def query = UserData.where {
        (
                teams { id in me.getAuthorities().id } && status { isOpen == true }
        ) || (
                owner == user && status { isOpen == true }
        )
    }

    return query

}
更新1 调试应用程序时,您可以清楚地看到authorities变量在工作版本中传递给DetachedCriteria#handleJunction(Closure callable),但从服务方法调用时消失

集成测试1-具有权限属性

集成测试2-无权限属性

解决方案 请参阅解决方案处

对我来说,测试总是失败,我不知道为什么测试2和3显示不同的行为,但在我将UserData.groovy中的
列表团队
更改为
列表团队
后,测试3通过了

在GORM文档中,映射字段的声明经常被忽略,这在本例中也适用


希望这也适用于您。

什么版本的grails?grails版本:3.2.6当您使用静态类型而不是
def
时会发生什么?似乎很有希望。在my IDE(IntelliJ)中运行时,所有测试都通过。但是,从命令行运行:grailstest app-integration-Dgrails.env=test每次在ExampleITSpec.groovy的第99行都会失败。我将更新版本推送到静态类型分支。我的更改:在IntelliJ中再次运行了它,而“有时失败”测试今天早上再次失败。我必须运行grails clean一次。所有测试都通过了。非常感谢你!
def getMyOrMyTeamsData(User me) {
    // To fix the test Toggle these two lines
    def user = me
//        def user = User.get(me.id)

    def query = UserData.where {
        (
                teams { id in me.getAuthorities().id } && status { isOpen == true }
        ) || (
                owner == user && status { isOpen == true }
        )
    }

    return query

}