如何有效地比较两个相同类的对象并检查哪些字段不同?

时间:2019-02-23 20:22:02

标签: java spring spring-boot java-8

我想编写一个通用函数,该函数接受相同实体类的两个对象,并比较不同的字段,并返回随时间对特定字段所做的所有更改的列表。

在众多实体类别中,有一个成员称呼如下

public class Member {
    String firstName;
    String lastName;
    String driverLicenseNumber;
    Integer age;
    LocalDateTime timestamp;
}

在数据库中,我有一个名为member_audit的表,只要使用触发器在成员表中发生了变化(对于其他实体类似),该表就会填充旧数据。

我将要返回的每个实体的资源列表如下

public class MemberAuditsResource {
    private String field;
    private LocalDateTime on;
    private String changeType;
    private String oldValue;
    private String newValue;
}

我只能想到像这样分别为每个实体编写一个函数

private List<MembeAuditsResource> memberCompare(Member obj1, Member obj2) {

    //Compare every field in both the objects using if else and populate the resource.

}

然后调用上面的函数来比较entity_audit表中的每对记录。 该代码将非常大,无法比较每个字段并乘以不同的实体。 有没有更好,更有效的方法?

2 个答案:

答案 0 :(得分:3)

如果您扩展思路以比较对象图,那么这不是一个小问题。因此,有效的方法不是重新发明轮子,而是使用诸如JaVers之类的现有库:

const Twit = require('twit');
const config = require('./config');
const util = require("util");
const bot = new Twit(config);

// Wrapping my code in a promise wrapper...
let post_promise = require('util').promisify( // Wrap post function w/ promisify to allow for sequential posting.
  (options, data, cb) => bot.post(
    options,
    data,
    (err, ...results) => cb(err, results)
  )
);

// Async/await for the results of the previous post, get the id...
const tweet_crafter = async (array, id) => { 
  for(let i = 1; i < array.length; i++){
    let content = await post_promise('statuses/update', { status: array[i], in_reply_to_status_id: id });
    id = content[0].id_str;
  };
};

const tweet = (first, subsequent) => { 
  post_promise('statuses/update', { status: `${first}` })
    .then((top_tweet) => {
        console.log(`${top_tweet[0].text} tweeted!`);
        let starting_id = top_tweet[0].id_str; // Get top-line tweet ID...
        tweet_crafter(subsequent, starting_id);
    })
    .catch(err => console.log(err));
};

module.exports = tweet;

然后,您可以获得类似的内容:

Member oldMember = new Member("foo" ,"chan" ,"AB12" , 21 ,LocalDateTime.now());
Member newMember = new Member("bar" ,"chan" ,"AB12" , 22 ,LocalDateTime.now());

Diff diff = javers.compare(oldMember, newMember);
for(Change change:  diff.getChanges()) {
    System.out.println(change);
}

答案 1 :(得分:0)

使用JSON Map方法将两个对象都转换为objectMapper.convertValue。然后,您可以轻松比较两个地图的键/值并创建差异列表。