2015-08-25 2 views
-2

Я хочу сравнить два объекта i.e два поля строк базы данных по полю. , например. Object1[name="ABC", age=29, email="[email protected]"] и Object2[name="XYZ", age=29, email="[email protected]"]Сравните два объекта по полю и покажите разницу

предположим, что я хочу, чтобы сравнить эти два объекта, и я хочу, выход как этот

[{ 
"fieldName" : "email", 
"OldObjectValue" : "[email protected]", 
"NewObjectValue" : "[email protected]" 
}, 
{ 
"fieldName" : "name", 
"OldObjectValue" : "ABC", 
"NewObjectValue" : "XYZ" 
}] 

Здесь возраст же так возраст поле не присутствует на выходе.

Если это возможно, выполнив общий метод с использованием отражения, пожалуйста, предоставьте код. потому что я еще не работал над размышлением. Пожалуйста, помогите.

+0

Если вы хотите, чтобы это реализовано в бизнес-логике, то это, вероятно, будет происходить в вашем коде Java, в этом случае тег Hibernate не может быть целесообразным. –

+0

@bitstrider Я попытался вручную сравнить каждое поле с помощью equals и == –

+0

, что вы хотите сделать с выходом, сохранить его в объекте? – bitstrider

ответ

3

Согласно вашему требованию вы можете сделать это, как следует.

Вы можете взять две строки базы данных на два объекта. Например: SampleObject

public class SampleObject { 

private String name; 
private int age; 
private String email; 

public SampleObject(String name, int age, String email) { 
    this.name = name; 
    this.age = age; 
    this.email = email; 
} 
. 
. 

Я предполагаю, что ваши результаты также будут объектом. Например: ResultObject

public class ResultObject { 

private String fieldName; 
private String OldObjectValue; 
private String NewObjectValue; 
. 
. 

Вы можете просто определить compareField вид метода в SampleObject

public List<ResultObject> compareFields(SampleObject object) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException{ 
    List<ResultObject> resultList = new ArrayList<ResultObject>();  
    Field[] fields = this.getClass().getDeclaredFields(); 

    for(Field field : fields){ 
     if(!field.get(this).equals(field.get(object))){ 
      ResultObject resultObject = new ResultObject(); 
      resultObject.setFieldName(field.getName()); 
      resultObject.setOldObjectValue(field.get(this).toString()); 
      resultObject.setNewObjectValue(field.get(object).toString()); 
      resultList.add(resultObject); 
     } 
    } 
    return resultList; 
} 

Тогда вы можете заставить его работать.

SampleObject object1 = new SampleObject("ABC", 29, "[email protected]"); 
    SampleObject object2 = new SampleObject("XYZ", 29, "[email protected]"); 

    List<ResultObject> resultList = object1.compareFields(object2); 

Благодаря

+0

Спасибо за помощь ... Если у меня есть 20 полей в объекте, тогда этот код не поможет, поскольку мне нужно сравнить каждое поле ... Мне нужно общее решение для этого –

+0

Да. Только выпуск для общего решения - это имя поля. Но мы можем использовать java Reflection для получения имени поля. Если это так, мы можем написать это в общем виде. – isurujay

+0

Сообщение было обновлено. Используемые java-отражения для общего решения. благодаря – isurujay

Смежные вопросы