我想编写一个通用函数,该函数接受相同实体类的两个对象,并比较不同的字段,并返回随时间对特定字段所做的所有更改的列表。
在众多实体类别中,有一个成员称呼如下
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表中的每对记录。 该代码将非常大,无法比较每个字段并乘以不同的实体。 有没有更好,更有效的方法?
答案 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
。然后,您可以轻松比较两个地图的键/值并创建差异列表。