我正在用MongoDB编写一个play2.1应用程序,我的模型对象有点广泛。在更新数据库中的条目时,我需要将来自表单的临时对象与数据库中的对象进行比较,以便构建更新查询(并记录更改)。
我正在寻找一种方法,一般采取2个示例,并得到他们的不同。迭代每个数据成员是很长的、硬编码的,而且容易出错(如果a.firstName.equalsIgnoreCase(b.first stName)),所以我正在寻找一种方法来迭代所有数据成员并横向比较它们(名称->值的Map就可以了,或者我可以信任的列表每次都以相同的顺序枚举数据成员)。
有什么好主意吗?
case class Customer(
id: Option[BSONObjectID] = Some(BSONObjectID.generate),
firstName: String,
middleName: String,
lastName: String,
address: List[Address],
phoneNumbers: List[PhoneNumber],
email: String,
creationTime: Option[DateTime] = Some(DateTime.now()),
lastUpdateTime: Option[DateTime] = Some(DateTime.now())
)
下面的三个解决方案都很棒,但我仍然无法获得该字段的名称,对吗?这意味着我可以记录更改,但不能记录它影响的领域...
4条答案
按热度按时间dldeef671#
也许
productIterator
就是您想要的:guicsvcw2#
扩展@Malte_Schwerhoff的答案,您可能会创建一个递归的diff方法,该方法不仅生成差异的索引,而且将它们Map到该索引处的新值-或者在嵌套的Product类型的情况下,Map到子Product差异的Map:
对该答案中的用例进行扩展:
ogq8wdun3#
如果要使用非标准相等(如
String.equalsIgnoreCase
),则可以使用乘积迭代器,并对元素进行匹配。使用案例:
ffscu2ro4#
如果您想访问字段名,可以使用Java的反射API。在本例中,您可以使用
getDeclaredFields
方法访问声明的字段并迭代这些字段。如果您随后想要访问字段的值更改,则需要将其设置为可访问(setAccessible
方法),因为默认情况下,所有类参数都实现为具有公共访问器的私有字段。