【问题标题】:Grails: Comparing two unsaved domain class objects always returns falseGrails:比较两个未保存的域类对象总是返回 false
【发布时间】:2026-01-23 08:45:02
【问题描述】:

我需要比较几个尚未保存的域类对象,但是,我总是从比较中得到错误的结果。事实证明,即使以下比较也会返回 false:

new DomainClass().equals(new DomainClass())

由于两者都是全新的对象,它们应该具有相同的数据并且应该彼此相等。不幸的是,equals 方法(或 == 运算符)返回 false。是否有另一种正确的方法来进行这种比较?

【问题讨论】:

  • 这可能对你有帮助:*.com/questions/1407311/…
  • 上面的链接对您有帮助吗?另外,此时是否需要将它们保存到数据库中?

标签: grails groovy comparison equals grails-domain-class


【解决方案1】:

您的代码与此相同:

a = new DomainClass();
b = new DomainClass();

a.equals(b)

很明显,只要 ab 没有引用同一个对象,测试就必须返回 false。

如果您想要基于值的比较:
遍历字段并一一比较

或者在这里查看more formal way of doing it

【讨论】:

    【解决方案2】:

    您可以使用类似于 compareTo() 的“宇宙飞船运算符”() 或者您可以覆盖 DomainClass 中的 equals() 方法,以便能够使用此代码 new DomainClass().equals(new DomainClass())

    要覆盖equals(),你可以使用@EqualsAndHashCode注解 这个注解自动生成equals()和hashcode()方法 所以,你的类将如下所示:

    @EqualsAndHashCode
    class DomainClass(){
       String field1
       String filed2
       etc
    }
    

    您生成的 equals 方法将如下所示:

    public boolean equals(java.lang.Object other)
             if (other == null) return false
             if (this.is(other)) return true
             if (!(other instanceof DomainClass)) return false
             if (!other.canEqual(this)) return false
             if (field1 != other.field1) return false
             if (field2 != other.field2) return false
    //         etc
           return true
    }
    

    更多详情请看http://groovy.codehaus.org/api/groovy/transform/EqualsAndHashCode.html

    【讨论】: