使用“in”查询关闭的GORM删除生成的SQL中的where子句

时间:2017-04-12 13:52:54

标签: hibernate grails gorm

源代码: https://github.com/HybridProgrammer/GormIn

Grails版本: 3.2.8

我正在尝试运行以下查询:

def query = UserData.where {
    teams { id in teamIds }
}

在Spock测试中运行查询时,它可以正常工作。从Grails服务运行它时,它返回UserData中的所有行,并且不会仅筛选出teamIds列表中属于该团队的那些用户。

Spock测试

从Spock测试运行查询 - 始终通过

void "never fails - direct approach"() {
    given:
    setupData()
    def me = User.first()
    def teamIds = me.getAuthorities().id

    when:
    def query = UserData.where {
        teams { id in teamIds }
    }

    then:
    teamIds.size() == 1
    query.size() == 2
}

生成SQL

select count(*) as y0_ 
from user_data this_ inner join workflow_role_teams teams3_ 
    on this_.id=teams3_.user_data_teams_id inner join role teams_alia1_ 
    on teams3_.role_id=teams_alia1_.id 
 where teams_alia1_.id in (?) 
 limit ?

从Grails服务运行查询

偶尔传递IntelliJ,从不形成CLI

void "sometimes fails"() {
    given:
    setupData()
    def me = User.first()

    when:
    def query = exampleService.getMyOrMyTeamsData(me)

    then:
    me.getAuthorities().size() == 1
    query.size() == 2
}

exampleService.getMyOrMyTeamsData

def getMyOrMyTeamsData(User me) {
    def teamIds = me.getAuthorities().id

    def query = UserData.where {
        teams { id in teamIds }
    }

    return query
}

生成SQL

select count(*) as y0_ 
from user_data this_ inner join workflow_role_teams teams3_ 
    on this_.id=teams3_.user_data_teams_id inner join role teams_alia1_ 
    on teams3_.role_id=teams_alia1_.id 
limit ?

解决方案

请参阅解决方案分支 https://github.com/HybridProgrammer/GormIn/commit/d510e63b3e85b82ce06e24d8a392c10873a8306c

1 个答案:

答案 0 :(得分:0)

问题在这里得到解答:

Seemingly Random 1=1 where clause generated by GORM's where closure

在grails-app / domain / oneisone / UserData.groovy

List teams = new ArrayList()

更改为

List<Role> teams = new ArrayList()

运行grails clean然后重新运行测试。