在比较 Scala 中的两个对象时没有得到正确的结果

问题描述

Pojo 课程

    case class RulePojoMigration(val tolerance_id:Int,val asset_id:Int,measure: String,cond: String,function: String,threshold_value: String,rule_dts: String,filter: util.List[Filter],is_enabled: String,mode: String,tolerance_status: String,action_key: String,email_ids: util.List[String],rule_name:String,rule_owner:String,group_by: util.List[String],relax_variation_band:String,reconciliation_id:Int)
case class Filter(value: String,operator: String,dimension: String)
    Below is the code used to fetch the object from DB
    
    if (checkRuleIsEditOrNot) {
                        ps = con.prepareStatement(WSQueryConstant.RULE_MIGRATION_GET_COMPLETE_RULE_INFO_FROM_STAGE)
                        ps.setInt(1,rulePojo.tolerance_id)
                        rs = ps.executeQuery
    
                        var dbRulePojo: RulePojoMigration = null
                        val jsonRulePojo: RulePojoMigration = rulePojo
                        if (rs.next()) {
                            val rule_tolerance_asset_id = rs.getInt(2)
                            val measure = rs.getString(3)
                            val cond = rs.getString(4)
                            val function = rs.getString(5)
                            val threshold_value = rs.getString(6)
                            val rule_dts = rs.getString(7)
                            val filter = gson.fromJson(rs.getString(8),classOf[util.List[Filter]])
                            val is_enabled = rs.getString(9)
                            val mode = rs.getString(10)
                            val tolerance_status = rs.getString(11)
                            val email_ids = gson.fromJson(rs.getString(12),classOf[java.util.List[String]])
                            val rule_name = rs.getString(13)
                            val rule_owner = rs.getString(14)
                            val group_by = gson.fromJson(rs.getString(15),classOf[java.util.List[String]])
                            val relax_variation_band = rs.getString(16)
                            var reconciliation_id = rs.getString(17)
                            if(reconciliation_id== null)
                                 reconciliation_id= "-1"
                            dbRulePojo = RulePojoMigration(jsonRulePojo.tolerance_id,rule_tolerance_asset_id,measure,cond,function,threshold_value,rule_dts,filter,is_enabled,mode,tolerance_status,jsonRulePojo.action_key,email_ids,rule_name,rule_owner,group_by,relax_variation_band,reconciliation_id.toInt)
  1. 具有以下值的用户请求。

    RulePojoMigration(1274,1234,*,less than,count,100,2020-07-04 05:31:29,[Filter(Hello,equal,funnel_state)],1,static,null,EMAIL,[x],StaticruleMigrationTesting,email,[ALL],-1)

  2. MysqL 数据库中可用的对象

    RulePojoMigration(1274,[{value=Hello,operator=equal,dimension=funnel_state}],-1)

所以我想检查两个对象的相等性,以便用户可以在有效负载发生任何更改时修改现有对象,或者只是他/她应该收到一条消息,说明存在重复条目。 jsonRulePojo.equal(dbRulePojo) 应该是真的,无论如何,两个对象的值都是相同的。

解决方法

默认的 equals 操作不检查两个类的内容,它只检查两个值是否引用同一个对象。因此,即使每个字段都相同,RulePojoMigration 的两个实例也将始终不同。默认情况下,两个类只有在它们是同一个实例时才相等。

当定义了 case class 时,Scala 将生成一个 equals,它会依次检查传递给构造函数的每个字段。因此,如果两个 case classe 具有相同的内容,则它们将相等。

因此您可以通过以下两种方式之一修复此代码:

  1. 使RulePojoMigration成为case class
  2. equals 方法添加到 RulePojoMigration
,

我可以通过进行以下更改来解决该错误。

From
val filter = gson.fromJson(rs.getString(8),classOf[util.List[Filter]]) 
To 
 val filter = gson.fromJson(rs.getString(8),classOf[Array[Filter]])

dbRulePojo = RulePojoMigration(jsonRulePojo.tolerance_id,rule_tolerance_asset_id,measure,cond,function,threshold_value,rule_dts,java.util.Arrays.asList(filter:_*),is_enabled,mode,tolerance_status,jsonRulePojo.action_key,email_ids,rule_name,rule_owner,group_by,relax_variation_band,reconciliation_id.toInt)

而不是将 filter 直接传递给 dbRulePojo 我传递了 java.util.Arrays.asList(filter:_*)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...