gorm-hibernate5 icon indicating copy to clipboard operation
gorm-hibernate5 copied to clipboard

Entity.find with closure breaks in Spock then: block

Open sbglasius opened this issue 3 years ago • 0 comments

When doing a query with a .find { } method on a domain object (in this case in a Grails 4.0.11 application) the generated detached criteria does not contain the criteria defined in code.

Example:

    def "test where query is in then block with def"() {
        given:
        Bundle bundle = new Bundle(name: 'bundle')
        bundle.addToVersions(name: '1.0')
        bundle.save(flush: true)

        when:
        bundle.addToVersions(name: '1.1')
        bundle.save(flush: true)

        then:
        def result = BundleVersion.find({ name == '1.1' && bundle.name == 'bundle' })
        result.name == '1.1'
    }

where the result is a variable, then it works. But if the variable is omitted like this:

    def "test where query is in then block without def"() {
        given:
        Bundle bundle = new Bundle(name: 'bundle')
        bundle.addToVersions(name: '1.0')
        bundle.save(flush: true)

        when:
        bundle.addToVersions(name: '1.1')
        bundle.save(flush: true)

        then: "this will fail - which is not expected"
        BundleVersion.find({ name == '1.1' && bundle.name == 'bundle' }).name == '1.1'
    }

Then 1.0 is found which is unexpected.

An example of this behaviour can be found here: https://github.com/sbglasius/gorm-query-bug

Discovered by @thomas58

sbglasius avatar Aug 30 '21 14:08 sbglasius